Submission #88722

# Submission time Handle Problem Language Result Execution time Memory
88722 2018-12-07T22:50:58 Z jasony123123 Zoltan (COCI16_zoltan) C++11
42 / 140
1000 ms 2096 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 pow(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*pow(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 376 KB Output is correct
3 Correct 2 ms 448 KB Output is correct
4 Correct 2 ms 524 KB Output is correct
5 Correct 2 ms 544 KB Output is correct
6 Correct 2 ms 544 KB Output is correct
7 Incorrect 6 ms 620 KB Output isn't correct
8 Incorrect 6 ms 620 KB Output isn't correct
9 Incorrect 6 ms 748 KB Output isn't correct
10 Incorrect 6 ms 748 KB Output isn't correct
11 Execution timed out 1067 ms 1756 KB Time limit exceeded
12 Execution timed out 1074 ms 1756 KB Time limit exceeded
13 Execution timed out 1080 ms 1756 KB Time limit exceeded
14 Execution timed out 1064 ms 1756 KB Time limit exceeded
15 Execution timed out 1080 ms 1756 KB Time limit exceeded
16 Execution timed out 1085 ms 1888 KB Time limit exceeded
17 Execution timed out 1085 ms 2044 KB Time limit exceeded
18 Execution timed out 1078 ms 2064 KB Time limit exceeded
19 Execution timed out 1084 ms 2064 KB Time limit exceeded
20 Execution timed out 1066 ms 2096 KB Time limit exceeded