Submission #341459

#TimeUsernameProblemLanguageResultExecution timeMemory
341459ryanseeMonochrome Points (JOI20_monochrome)C++14
100 / 100
381 ms410860 KiB
#include "bits/stdc++.h" using namespace std; #define FAST ios_base::sync_with_stdio(false); cin.tie(0); #define pb push_back #define eb emplace_back #define ins insert #define f first #define s second #define cbr cerr<<"hi\n" #define mmst(x, v) memset((x), v, sizeof ((x))) #define siz(x) ll(x.size()) #define all(x) (x).begin(), (x).end() #define lbd(x,y) (lower_bound(all(x),y)-x.begin()) #define ubd(x,y) (upper_bound(all(x),y)-x.begin()) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //can be used by calling rng() or shuffle(A, A+n, rng) inline long long rand(long long x, long long y) { return rng() % (y+1-x) + x; } //inclusivesss string inline to_string(char c) {string s(1,c);return s;} template<typename T> inline T gcd(T a,T b){ return a==0?llabs(b):gcd(b%a,a); } using ll=long long; using ld=long double; #define FOR(i,s,e) for(ll i=s;i<=ll(e);++i) #define DEC(i,s,e) for(ll i=s;i>=ll(e);--i) using pi=pair<ll,ll>; using spi=pair<ll,pi>; using dpi=pair<pi,pi>; long long LLINF = 1e18; int INF = 1e9+1e6; #define MAXN (600006) // put 6 ll n, ans, grad[MAXN], ofs, neg, pos, zero, best; deque<int> vv[MAXN]; deque<int>*v=vv+(MAXN/2); deque<char> A; ll nC2(ll n) { return n * (n-1) / 2; } int main() { FAST cin>>n; A.resize(n*2); for(auto&i:A)cin>>i; FOR(i,0,n-1) { if(i) grad[i] += grad[i-1]; if(A[i] == 'W') { -- grad[i]; } if(A[n+i] == 'B') { ++ grad[i]; } ans += abs(grad[i]); v[grad[i]].eb(i); neg += grad[i] < 0, pos += grad[i] > 0, zero += grad[i] == 0; } assert(grad[n-1] == 0); FOR(i,0,n*2-1) { best = max(best, nC2(n) - ans); A.eb(A[0]), A.pop_front(); ll o=grad[i]+ofs; neg -= grad[i] + ofs < 0, pos -= grad[i] + ofs > 0, zero -= grad[i] + ofs == 0; v[grad[i]].pop_front(); grad[i] += ofs; grad[i] *= -1; ans += grad[i] * pos, ans -= grad[i] * neg, ans += abs(grad[i]) * zero, ofs += grad[i]; if(grad[i]==1){ pos += zero, zero = v[-ofs].size(), neg -= zero; }else if(grad[i]==-1){ neg += zero, zero = v[-ofs].size(), pos -= zero; }else assert(grad[i]==0); grad[i+n] = grad[i+n-1] + o; v[grad[i+n]].eb(i+n); ans -= abs(o), ans += abs(grad[i+n]+ofs); neg += grad[i+n] + ofs < 0, pos += grad[i+n] + ofs > 0, zero += grad[i+n] + ofs == 0; // FOR(j,i+1,i+n) cerr<<grad[j]<<' '; cerr<<'\n'; // cerr<<ofs<<'\n'; } cout<<best<<'\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...