답안 #314736

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
314736 2020-10-21T00:45:16 Z misir Zoltan (COCI16_zoltan) C++14
140 / 140
118 ms 9208 KB
/*بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِيم*/

//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx,avx2,fma")

#include <bits/stdc++.h>
using namespace std;
#define FASTIO ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
typedef long long ll;
//using pii = pair<int, int>;
const double PI = acos(-1.0);
const ll mod = 1e9 + 7;
//const ll mod = 998244353;


inline void normal(ll &a) { a %= mod; (a < 0) && (a += mod); }
inline ll modMul(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a * b) % mod; }
inline ll modAdd(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); return (a + b) % mod; }
inline ll modSub(ll a, ll b) { a %= mod, b %= mod; normal(a), normal(b); a -= b; normal(a); return a; }
inline ll modPow(ll b, ll p) { ll r = 1; while (p) { if (p & 1) r = modMul(r, b); b = modMul(b, b); p >>= 1; } return r; }
inline ll modInverse(ll a) { return modPow(a, mod - 2); }
inline ll modDiv(ll a, ll b) { return modMul(a, modInverse(b)); }

#define si(x) scanf("%d",&x)
#define sii(x,y) scanf("%d %d",&x,&y)
#define siii(x,y,z) scanf("%d %d %d",&x,&y,&z)
#define sl(x) scanf("%lld",&x)
#define sll(x,y) scanf("%lld %lld",&x,&y)
#define slll(x,y,z) scanf("%lld %lld %lld",&x,&y,&z)
#define ss(ch) scanf("%s",ch)
#define pi(x) printf("%d",x)
#define pii(x,y) printf("%d %d",x,y)
#define piii(x,y,z) printf("%d %d %d",x,y,z)
#define pl(x) printf("%lld",x)
#define pll(x,y) printf("%lld %lld",x,y)
#define plll(x,y,z) printf("%lld %lld %lld",x,y,z)
#define ps(ch) printf("%s",ch)
#define F(i,a,b)      for(int i= a; i <= b; i++)
#define R(i,b,a)      for(int i= b; i >= a; i--)
#define REP(i,n) for(int i = 0; i < (n); i++)

int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int dx8[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy8[] = {1, -1, -1, 0, 1, -1, 0, 1};
int kx8[] = {1, 1, 2, 2, -1, -1, -2, -2};
int ky8[] = {2, -2, 1, -1, 2, -2, 1, -1};
/* for Random Number generate
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
*/
///**
template < typename F, typename S >ostream& operator << ( ostream& os, const pair< F, S > & p ) {return os << "(" << p.first << ", " << p.second << ")";}
template < typename T >ostream &operator << ( ostream & os, const vector< T > &v ) {os << "{"; for (auto it = v.begin(); it != v.end(); ++it) {if ( it != v.begin() ) os << ", "; os << *it;} return os << "}";}
template < typename T >ostream &operator << ( ostream & os, const set< T > &v ) {os << "["; for (auto it = v.begin(); it != v.end(); ++it) {if ( it != v.begin()) os << ", "; os << *it;} return os << "]";}
template < typename F, typename S >ostream &operator << ( ostream & os, const map< F, S > &v ) {os << "["; for (auto it = v.begin(); it != v.end(); ++it) {if ( it != v.begin() ) os << ", "; os << it -> first << " = " << it -> second ;} return os << "]";}
#define dbg(args...) do {cerr << #args << " : "; faltu(args); } while(0)
clock_t tStart = clock();
#define timeStamp dbg("Execution Time: ", (double)(clock() - tStart)/CLOCKS_PER_SEC)
void faltu () { cerr << endl; }
template <typename T>void faltu( T a[], int n ) {for (int i = 0; i < n; ++i) cerr << a[i] << ' '; cerr << endl;}
template <typename T, typename ... hello>
void faltu( T arg, const hello &... rest) { cerr << arg << ' '; faltu(rest...); }

// Program showing a policy-based data structure.
#include <ext/pb_ds/assoc_container.hpp> // Common file 
#include <ext/pb_ds/tree_policy.hpp>
#include <functional> // for less 
using namespace __gnu_pbds;

// GNU link : https://goo.gl/WVDL6g
typedef tree<int, null_type, less_equal<int>, rb_tree_tag,
        tree_order_statistics_node_update>
        new_data_set;
// find_by_order(k) – ফাংশনটি kth ordered element এর একটা পয়েন্টার রিটার্ন করে। অর্থাৎ তুমি চাইলেই kth ইন্ডেক্সে কি আছে, সেটা জেনে ফেলতে পারছো!
// order_of_key(x) – ফাংশনটি x এলিমেন্টটা কোন পজিশনে আছে সেটা বলে দেয়।
//*//**___________________________________________________**/
const int N = 200006;

struct pii
{
	int ft, sd;
};

int n, m;
int a[N], P2[N];
pii le[N], gr[N];

inline void upd( pii &a,  const pii &b) {
	if (b.ft >= a.ft) {
		if (b.ft == a.ft) {
			a.sd += b.sd;
			if (a.sd >= mod) a.sd -= mod;
		} else {
			a = b;
		}
	}
}

pii f[N];

inline void fupd(int i, pii v) { for (i++; i < N; i += i & -i) upd(f[i], v); }
inline pii fget(int i) { pii v {0, 0}; for (; i; i -= i & -i) upd(v, f[i]); return v; }

void count(pii *v) {
	memset(f, 0, sizeof f);
	for (int i = 0; i < n; ++i) {
		v[i] = {0, 1};
		upd(v[i], fget(a[i]));
		v[i].ft++;
		fupd(a[i], v[i]);
	}
}


// copy....
int main()
{
	FASTIO
	/*
#ifndef ONLINE_JUDGE
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
	freopen("error.txt", "w", stderr);
#endif
//*/
	P2[0] = 1;
	for (int i = 1; i < N; i++) {
		P2[i] = modAdd(P2[i - 1], P2[i - 1]);
	}

	cin >> n;
	for (int i = 0; i < n; i++)cin >> a[n - i - 1];
	int *b = (int*)memcpy(malloc(n << 2), a, n << 2);
	sort(b, b + n);
	m = unique(b, b + n) - b;
	for (int i = 0; i < n; i++)
		a[i] = lower_bound(b, b + m, a[i]) - b + 1;
	count(le);
	for (int i = 0; i < n; i++)a[i] = m + 1 - a[i];
	count(gr);
	int M = 1;
	for (int i = 0; i < n; i++)
		M = max(M, le[i].ft+gr[i].ft - 1);
	int ans = 0;
	for (int i = 0; i < n; i++) {
		if (le[i].ft + gr[i].ft < M + 1)continue;
		ans = modAdd(ans, modMul(P2[n - M], modMul(le[i].sd, gr[i].sd)));
	}
	cout << M << " "<<ans << "\n";
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 2688 KB Output is correct
2 Correct 3 ms 2688 KB Output is correct
3 Correct 3 ms 2688 KB Output is correct
4 Correct 3 ms 2688 KB Output is correct
5 Correct 3 ms 2688 KB Output is correct
6 Correct 3 ms 2688 KB Output is correct
7 Correct 4 ms 2688 KB Output is correct
8 Correct 3 ms 2688 KB Output is correct
9 Correct 4 ms 2688 KB Output is correct
10 Correct 3 ms 2688 KB Output is correct
11 Correct 69 ms 7672 KB Output is correct
12 Correct 58 ms 6904 KB Output is correct
13 Correct 58 ms 6776 KB Output is correct
14 Correct 81 ms 7288 KB Output is correct
15 Correct 104 ms 8440 KB Output is correct
16 Correct 118 ms 9208 KB Output is correct
17 Correct 79 ms 8696 KB Output is correct
18 Correct 82 ms 8696 KB Output is correct
19 Correct 82 ms 8828 KB Output is correct
20 Correct 83 ms 8696 KB Output is correct