Submission #883705

#TimeUsernameProblemLanguageResultExecution timeMemory
883705vjudge1Zoltan (COCI16_zoltan)C++17
42 / 140
106 ms33864 KiB
#pragma GCC optimize("unroll-loops,Ofast,O3") #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define spc << " " << #define endl "\n" #define all(x) x.begin(), x.end() #define int long long #define ii pair<int,int> #define vi vector<int> #define vii vector<ii> #define st first #define nd second #define inf 1000000009 #define MOD 998244353 #define lim 200005 using namespace std; int add(int x, int y){ if(x+y>=MOD) return x+y-MOD; return x+y; } int mult(int x, int y){ return ((x%MOD) * (y%MOD))%MOD; } int exp(int b, int t){ int res = 1; while(t>0){ if(t%2){ t--; res *=b; res%=MOD; continue; } t/=2; b*=b; b%=MOD; } return res; } void solve(){ int n; cin >> n; int arr[n+1]; for(int i=1; i<=n; i++) cin >> arr[i]; vi inc(1, 0), dec(1, inf); vector<vi> past1 = {{inf}}, past2 = {{0}}; vector<vi> pref1 = {{1}}, pref2 = {{1}}; ii ans[n+1]; int maxi=0; for(int i=n; i>=1; i--){ //cerr << "---" spc i spc "---" << endl; int pos = lower_bound(all(inc), arr[i]) - inc.begin(); if(pos == inc.size()){ inc.pb(arr[i]); vi v = {inf}; vi vv = {0}; past1.pb(v); pref1.pb(vv); } else{ inc[pos] = arr[i]; } past1[pos].pb(arr[i]); int aft1 = lower_bound(all(past1[pos-1]), arr[i], greater<int>()) - past1[pos-1].begin(); //for(auto j:past1[pos-1]) cerr << j << endl; //cerr << aft1 << endl; int cnt1 = pref1[pos-1].back(); if(aft1>1) cnt1 -= (pref1[pos-1][aft1-1]); pref1[pos].pb(pref1[pos].back() + cnt1); int pos2 = lower_bound(all(dec), arr[i], greater<int>()) - dec.begin(); if(pos2 == dec.size()){ dec.pb(arr[i]); vi vv = {0}; past2.pb(vv); pref2.pb(vv); } else{ dec[pos2] = arr[i]; } past2[pos2].pb(arr[i]); int aft2 = lower_bound(all(past2[pos2-1]), arr[i]) - past2[pos2-1].begin(); //cerr << "here" << endl; //for(auto j:past2[pos2-1]) cerr << j << endl; //cerr << aft2 << endl; int cnt2 = pref2[pos2-1].back(); if(aft2>1) cnt2 -= (pref2[pos2-1][aft2-1]); pref2[pos2].pb(pref2[pos2].back() + cnt2); ans[i].st = pos + pos2 -1; ans[i].nd = mult(cnt1, cnt2); maxi = max(maxi, ans[i].st); //cerr << cnt1 spc cnt2 << endl; //cerr << "wowsies" spc ans[i].st spc ans[i].nd << endl; } int tot=0; for(int i=1; i<=n; i++) if(ans[i].st == maxi) tot = add(tot, ans[i].nd); cout << maxi spc mult(tot, exp(2, n-maxi)) << endl; } signed main(){ ios_base::sync_with_stdio(false);cin.tie(0); #ifdef Local freopen("in","r",stdin); freopen("out","w",stdout); #endif /*freopen("fcolor.in","r",stdin); freopen("fcolor.out","w",stdout);*/ int t=1; //cin >> t; while(t--) solve(); }

Compilation message (stderr)

zoltan.cpp: In function 'void solve()':
zoltan.cpp:60:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |         if(pos == inc.size()){
      |            ~~~~^~~~~~~~~~~~~
zoltan.cpp:82:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |         if(pos2 == dec.size()){
      |            ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...