Submission #88723

# Submission time Handle Problem Language Result Execution time Memory
88723 2018-12-07T22:57:13 Z jasony123123 Zoltan (COCI16_zoltan) C++11
70 / 140
1000 ms 2140 KB
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
//#include <ext/pb_ds/tree_policy.hpp>
//#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
//using namespace __gnu_pbds;
#define FOR(i,start,end) for(int i=start;i<(int)(end);i++)
#define FORE(i,start,end) for(int i=start;i<=(int)end;i++)
#define RFOR(i,start,end) for(int i = start; i>end; i--)
#define RFORE(i,start,end) for(int i = start; i>=end; i--)
#define all(a) a.begin(), a.end()
#define mt make_tuple
#define v vector
#define sf scanf
#define pf printf
#define dvar(x) cout << #x << " := " << x << "\n"
#define darr(x,n) FOR(i,0,n) cout << #x << "[" << i << "]" << " := " << x[i] << "\n"
typedef long long ll;
typedef long double ld;
typedef pair<int, int > pii;
typedef pair<ll, ll> pll;
const ll MOD = 1000000007LL;
const ll PRIME = 105943LL;
const int INF = 1e6;
//template <class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<class T> void minn(T &a, T b) { a = min(a, b); }
template<class T> void maxx(T &a, T b) { a = max(a, b); }
void io() {
#ifdef LOCAL_PROJECT 
	freopen("input.in", "r", stdin); freopen("output.out", "w", stdout);
#else 
	/* online submission */
#endif 
	ios_base::sync_with_stdio(false); cin.tie(NULL);
}
/*************************COCI 16-17 R3 #5*************************/

void modd(ll &x) {
	x %= MOD;
}

const int MAXN = 200000;
int N;
int A[MAXN];
pll incr[MAXN], dcr[MAXN]; // length, #

/*/?????*/
pll genBest() { // length of best, # ways
	pll best = { -1,-1 };
	FOR(i, 0, N) {
		pll temp = { dcr[i].first + incr[i].first - 1, dcr[i].second*incr[i].second };
		if (temp.first > best.first)
			best = temp;
		else if (temp.first == best.first)
			best.second += temp.second;
		modd(best.second);
	}
	return best;
}

void calcIncr() {
	RFORE(i, N - 1, 0) {
		incr[i] = { 1, 1 };
		FOR(j, i + 1, N) if (A[i] < A[j]) {
			pll temp = { 1 + incr[j].first, incr[j].second };
			if (temp.first > incr[i].first)
				incr[i] = temp;
			else if (temp.first == incr[i].first)
				incr[i].second += temp.second;
		}
	}
}

void calcDcr() {
	RFORE(i, N - 1, 0) {
		dcr[i] = { 1, 1 };
		FOR(j, i + 1, N) if (A[i] > A[j]) {
			pll temp = { 1 + dcr[j].first, dcr[j].second };
			if (temp.first > dcr[i].first)
				dcr[i] = temp;
			else if (temp.first == dcr[i].first)
				dcr[i].second += temp.second;
		}
	}
}

ll mpow(ll a, ll p) {
	ll ret = 1LL;
	while (p) {
		if (p & 1LL)
			ret *= a;
		a *= a;
		modd(ret);
		modd(a);
		p >>= 1;
	}
	return ret;
}

int main(void) {
	io();
	cin >> N;
	FOR(i, 0, N) cin >> A[i];
	calcIncr();
	calcDcr();
	pll best = genBest();
	cout << best.first << "\n";
	ll ways = best.second*mpow(2, N - best.first);
	modd(ways);
	cout << ways << "\n";
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 448 KB Output is correct
3 Correct 2 ms 448 KB Output is correct
4 Correct 2 ms 448 KB Output is correct
5 Correct 2 ms 448 KB Output is correct
6 Correct 2 ms 612 KB Output is correct
7 Correct 5 ms 612 KB Output is correct
8 Correct 5 ms 612 KB Output is correct
9 Correct 5 ms 612 KB Output is correct
10 Correct 6 ms 676 KB Output is correct
11 Execution timed out 1062 ms 1680 KB Time limit exceeded
12 Execution timed out 1080 ms 1700 KB Time limit exceeded
13 Execution timed out 1061 ms 1700 KB Time limit exceeded
14 Execution timed out 1070 ms 1700 KB Time limit exceeded
15 Execution timed out 1077 ms 1896 KB Time limit exceeded
16 Execution timed out 1066 ms 1896 KB Time limit exceeded
17 Execution timed out 1086 ms 2136 KB Time limit exceeded
18 Execution timed out 1079 ms 2140 KB Time limit exceeded
19 Execution timed out 1073 ms 2140 KB Time limit exceeded
20 Execution timed out 1081 ms 2140 KB Time limit exceeded