Submission #292589

#TimeUsernameProblemLanguageResultExecution timeMemory
292589PajarajaMonochrome Points (JOI20_monochrome)C++17
100 / 100
166 ms4240 KiB
#include <bits/stdc++.h>
#define MAXN 200007
using namespace std;
vector<int> b,w;
int dx[MAXN],dy[MAXN],n;
long long val(int x)
{
	long long solc=0;
	int k=x,p=x;
	for(int i=0;i<x;i++)
	{
		while(w[k-x]<b[i] && k<n) k++;
		while(b[p]<w[n-x+i] && p<n) p++;
		solc+=(n-max(k,p)+min(k,p)-x);
	}
	k=0;
	for(int i=0;i<x;i++) 
	{
		while(w[n-x+k]<b[i]) k++;
		solc+=(i-k);
	}
	k=x;
	for(int i=x;i<n;i++) 
	{
		while(b[k]<w[i-x]) k++;
		solc+=(i-k);
	}
	return solc;
}
bool validl(int x)
{
	for(int i=0;i<x;i++) {dx[i]=b[i]; dy[i]=w[n-x+i];}
	for(int i=x;i<n;i++) {dx[i]=b[i]; dy[i]=w[i-x];}
	for(int i=0;i<x;i++) if(dx[i]>dy[i]) return false;
	return true;
}

bool validr(int x)
{
	for(int i=0;i<x;i++) {dx[i]=b[i]; dy[i]=w[n-x+i];}
	for(int i=x;i<n;i++) {dx[i]=b[i]; dy[i]=w[i-x];}
	for(int i=x;i<n;i++) if(dx[i]<dy[i]) return false;
	return true;
}
int main()
{
	string s;
	cin>>n; cin>>s;
	for(int i=0;i<2*n;i++) 
	{
		if(s[i]=='W') w.push_back(i);
		else b.push_back(i);
	}
	long long sol=0;
	int r=n,l=0,rzl,rzr;
	while(l!=r)
	{
		int s=(l+r)/2;
		if(validr(s)) r=s;
		else l=s+1;
	}
	rzl=l;
	r=n; l=0;
	while(l!=r)
	{
		int s=(l+r+1)/2;
		if(validl(s)) l=s;
		else r=s-1;
	}
	rzr=r;
	l=rzl; r=rzr;
	while(r-l>3)
	{
		int s1=(l+r)/2-1;
		int s2=(l+r)/2+1;
		int x=val(s1),y=val(s2);
		if(x<y) l=s1;
		else r=s2;
	}
	for(int i=l;i<=r;i++) sol=max(sol,val(i));
	cout<<sol;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...