Submission #614033

#TimeUsernameProblemLanguageResultExecution timeMemory
614033MohamedAliSaidaneMonochrome Points (JOI20_monochrome)C++14
35 / 100
2080 ms12800 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll> pll; typedef vector<int> vi; typedef vector<ll> vll; typedef vector<pii> vpi; typedef vector<pll> vpl; #define pb push_back #define popb pop_back #define all(x) (x).begin(), (x).end() #define ff first #define ss second const int nax = 4e5 + 4; int n; int col[nax], dp[nax]; vi perm, ot; int k = 1; vi st; void update(int i, int delt) { i += k; st[i] += delt; i /= 2; while(i) { st[i] = st[2 * i ] + st[2 * i + 1]; i /= 2; } } int query(int p ,int l, int r, int i, int j) { if( i > j ) return 0; if(l >= i && r <= j) return st[p]; int m = (l + r)/2; if(m + 1 > j) return query(2 * p, l, m ,i ,min(j, m)); else if(i > m) return query(2 * p + 1, m + 1, r, max(i,m + 1), j); else return query(2 * p, l, m ,i ,min(j, m)) + query(2 * p + 1, m + 1, r, max(i,m + 1), j); } int compute(int x) { if(x >= n) return 0 ; if(dp[x] != -1) return dp[x]; vpi inter; int rep = 0; for(int i= 0 ; i < n; i++) { int a = perm[(i + x)%n]; int b = ot[i]; inter.pb({min(a,b), max(a,b)}); } sort(all(inter)); reverse(all(inter)); for(int i= 0 ; i < n; i++) { int a = inter[i].ff; int b= inter[i].ss; rep += query(1, 0, k - 1, a, b); update(a, 1); update(b, -1); } for(int i = 0 ; i < n; i++) { int a = inter[i].ff; int b = inter[i].ss; update(a, -1); update(b, 1); } //cout << x << " " << rep <<"\n"; return dp[x] = rep; } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); memset(dp, -1,sizeof(dp)); cin >> n; k = 1; while(k < 2 * n) k = (k << 1); st.assign(2 * k + 1, 0 ); for(int i = 0 ; i < 2 * n ; i++) { char c; cin >> c; if(c == 'B') col[i] = 1; if(col[i]) perm.pb(i); else ot.pb(i); } int ans = 0 ; int debut = 0; int fin = n - 1; int rep = debut; while(debut <= fin ) { int mid = (debut + fin)/2; //cout << mid << ' ' << compute(mid) << ' ' << compute(mid + 1) << "\n"; if(compute(mid + 1) > compute(mid)) { rep = mid + 1; debut = mid + 1; ans = max(ans, compute(mid + 1)); } else { rep = mid ; fin = mid - 1; ans = max(ans, compute(mid )); } } cout << ans; }

Compilation message (stderr)

monochrome.cpp: In function 'int32_t main()':
monochrome.cpp:115:13: warning: variable 'rep' set but not used [-Wunused-but-set-variable]
  115 |         int rep = debut;
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...