Submission #314741

# Submission time Handle Problem Language Result Execution time Memory
314741 2020-10-21T01:02:21 Z misir Zoltan (COCI16_zoltan) C++14
140 / 140
119 ms 7480 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 from another submisssion
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;
}
# Verdict Execution time Memory 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 2 ms 2688 KB Output is correct
7 Correct 3 ms 2688 KB Output is correct
8 Correct 3 ms 2688 KB Output is correct
9 Correct 3 ms 2688 KB Output is correct
10 Correct 3 ms 2688 KB Output is correct
11 Correct 74 ms 6392 KB Output is correct
12 Correct 58 ms 5880 KB Output is correct
13 Correct 58 ms 5784 KB Output is correct
14 Correct 79 ms 6008 KB Output is correct
15 Correct 101 ms 6776 KB Output is correct
16 Correct 119 ms 7352 KB Output is correct
17 Correct 80 ms 7416 KB Output is correct
18 Correct 80 ms 7416 KB Output is correct
19 Correct 81 ms 7480 KB Output is correct
20 Correct 80 ms 7416 KB Output is correct