Submission #680483

#TimeUsernameProblemLanguageResultExecution timeMemory
680483GusterGoose27Zoltan (COCI16_zoltan)C++11
98 / 140
510 ms39940 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 2e5; const int MOD = 1e9+7; int n; int seq[MAXN]; map<int, int> compress; typedef pair<int, int> pii; typedef long long ll; int t = 0; pii comb(pii a, pii b) { if (a.first == b.first) return pii(a.first, (a.second+b.second)%MOD); return max(a, b); } class stree { public: int lp, rp; stree *l = nullptr; stree *r = nullptr; pii mx = pii(0, 0); stree(int lv, int rv) { lp = lv; rp = rv; if (lp < rp) { int mid = (lp+rp)/2; l = new stree(lp, mid); r = new stree(mid+1, rp); } } void upd(int p, pii v) { if (lp > p || rp < p) return; if (lp == rp) { mx = comb(mx, v); return; } l->upd(p, v); r->upd(p, v); mx = comb(l->mx, r->mx); } void reset() { mx = pii(0, 0); if (l) { l->reset(); r->reset(); } } pii query(int lv, int rv) { if (lp >= lv && rp <= rv) return mx; if (lp > rv || rp < lv) return pii(0, 0); return comb(l->query(lv, rv), r->query(lv, rv)); } }; stree *tree; pii upseq[MAXN]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; set<int> vals; for (int i = 0; i < n; i++) { cin >> seq[i]; vals.insert(seq[i]); } for (int v: vals) { compress[v] = t++; } for (int i = 0; i < n; i++) seq[i] = compress[seq[i]]; tree = new stree(0, t-1); pii ans(0, 0); for (int i = n-1; i >= 0; i--) { upseq[i] = tree->query(seq[i]+1, t-1); upseq[i].first++; if (upseq[i].second == 0) upseq[i].second++; tree->upd(seq[i], upseq[i]); } tree->reset(); for (int i = n-1; i >= 0; i--) { pii downseq = tree->query(0, seq[i]-1); downseq.first++; if (downseq.second == 0) downseq.second++; tree->upd(seq[i], downseq); ans = comb(ans, pii(upseq[i].first+downseq.first-1, ((ll)upseq[i].second*downseq.second)%MOD)); } for (int i = 0; i < n-ans.first; i++) ans.second = (2*ans.second)%MOD; cout << ans.first << " " << ans.second << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...