Submission #306040

#TimeUsernameProblemLanguageResultExecution timeMemory
306040TadijaSebezMonochrome Points (JOI20_monochrome)C++11
100 / 100
29 ms4464 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
const int N=400050;
char s[N];
ll ans[N];
int n;
void Add(int l,int r,int f){
	if(l>r)return;
	if(l<0)l+=n,r+=n;
	if(r>=n)Add(l,n-1,f),Add(0,r-n,f);
	else ans[l]+=f,ans[r+1]-=f;
}
int main(){
	scanf("%i",&n);
	scanf("%s",s+1);
	vector<int> b,w;
	for(int i=1;i<=2*n;i++){
		if(s[i]=='B')b.pb(i);
		else w.pb(i);
	}
	//for(int i:b)printf("%i ",i);printf("\n");
	//for(int i:w)printf("%i ",i);printf("\n");
	auto Get=[&](int i,int j){
		int x=abs(i-j)-1;
		return min(x,2*n-x-2);
	};
	for(int z=0,o=0,p=0,q=0;z<n;z++){
		int i=b[z];
		while(o<n&&w[o]<i)o++;
		p=max(p,o);
		while(p<n&&Get(w[p],i)==w[p]-i-1)p++;
		while(q<o&&Get(w[q],i)!=i-w[q]-1)q++;
		//printf("%i %i %i %i\n",i,q,o,p);
		Add(o-z,p-1-z,-i-1);
		Add(p-z,n-1-z,2*n+i-1);
		Add(0-z,q-1-z,2*n-i-1);
		Add(q-z,o-1-z,i-1);
	}
	swap(b,w);
	for(int z=0,o=0,p=0,q=0;z<n;z++){
		int i=b[z];
		while(o<n&&w[o]<i)o++;
		p=max(p,o);
		while(p<n&&Get(w[p],i)==w[p]-i-1)p++;
		while(q<o&&Get(w[q],i)!=i-w[q]-1)q++;
		//Add(o+z,p-1+z,-i);
		Add(z-(p-1),z-o,-i);
		//Add(p+z,n-1+z,i);
		Add(z-(n-1),z-p,i);
		//Add(0+z,q-1+z,-i);
		Add(z-(q-1),z-0,-i);
		//Add(q+z,o-1+z,i);
		Add(z-(o-1),z-q,i);
	}
	ll sol=0,sum=0;
	for(int i=0;i<n;i++){
		sum+=ans[i];
		sol=max(sol,sum);
	}
	printf("%lld\n",sol/2);
	/*
	int best=0;
	for(int i=0;i<n;i++){
		if(Get(b[0],w[i])>Get(b[0],w[best]))best=i;
	}
	ll ans=0;
	for(int t=best-1000;t<=best+1000;t++){
		ll now=0;
		for(int z=0;z<n;z++){
			int i=b[z],j=w[(z+t+n)%n];
			now+=Get(i,j);
		}
		ans=max(ans,now);
	}
	printf("%lld\n",ans/2);*/
	return 0;
}

Compilation message (stderr)

monochrome.cpp: In function 'int main()':
monochrome.cpp:16:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   16 |  scanf("%i",&n);
      |  ~~~~~^~~~~~~~~
monochrome.cpp:17:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   17 |  scanf("%s",s+1);
      |  ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...