제출 #1158695

#제출 시각아이디문제언어결과실행 시간메모리
1158695alexander707070Monochrome Points (JOI20_monochrome)C++20
35 / 100
1004 ms6704 KiB
#include<bits/stdc++.h> #define MAXN 400007 using namespace std; int n,br[MAXN],pref[MAXN]; char c[MAXN]; vector<int> B,W; vector< pair<int,int> > pairs; long long ans; struct Fenwick{ int fen[MAXN]; void update(int x,int val){ while(x<=2*n){ fen[x]+=val; x+=(x & (-x)); } } int getsum(int x){ int res=0; while(x>=1){ res+=fen[x]; x^=(x & (-x)); } return res; } int sum(int l,int r){ return getsum(r) - getsum(l-1); } }fenwick; long long solve(){ long long res=0; sort(pairs.begin(),pairs.end()); for(int i=1;i<=2*n;i++)pref[i]=0; for(auto s:pairs){ fenwick.update(s.second,1); pref[s.second]=1; } for(int i=1;i<=2*n;i++)pref[i]+=pref[i-1]; for(auto s:pairs){ int k=fenwick.sum(s.first+1,s.second-1); res+=(s.second-s.first-1) - (pref[s.second-1]-pref[s.first]) - k; fenwick.update(s.second,-1); } return res; } long long check(int pref){ pairs.clear(); for(int i=0;i<pref;i++){ if(B[i] > W[n-pref+i]){ return -1; } pairs.push_back({B[i],W[n-pref+i]}); } for(int i=pref;i<n;i++){ if(B[i] < W[i-pref]){ return -2; } pairs.push_back({W[i-pref],B[i]}); } return solve(); } int bin(){ int l=-1,r=n+1,tt; while(l+1<r){ tt=(l+r)/2; long long curr=check(tt); if(curr==-1){ r=tt; }else if(curr==-2){ l=tt; }else{ long long p=check(tt+1); if(curr<p){ l=tt+1; }else{ r=tt; } } } for(int s=-5;s<=5;s++){ if(l+s>=0 and l+s<=n)ans=max(ans,check(l+s)); } return ans; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n; for(int i=1;i<=2*n;i++){ cin>>c[i]; if(c[i]=='B')B.push_back(i); else W.push_back(i); } cout<<bin()<<"\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...