比赛 EYOI暨SBOI暑假快乐赛6th 评测结果 AAAAAAAAAA
题目名称 Count 1s 最终得分 100
用户昵称 ムラサメ 运行时间 0.305 s
代码语言 C++ 内存使用 4.66 MiB
提交时间 2022-06-30 10:00:33
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,maxx=0,minn=0;
int a[300010],b1[300010],b2[300010];
bool cmp(int x,int y){
	return x<y;
}
int main(){
	freopen("count1s.in","r",stdin);
	freopen("count1s.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	int temp;
	for(int i=1;i<=n;i++){
		cin>>temp;
		if(temp==0){//0,1翻转后的贡献 
			a[i]=1;
		}
		else{
			a[i]=-1;
		}
	}
	for(int i=1;i<=n;i++){//前缀和
		a[i]+=a[i-1];
	}
	for(int i=0;i<n;i++){
		if(a[i]>maxx){//记录上下界 
			maxx++;
		}
		else{
			if(a[i]<minn){
				minn--;
			}
		}
		b1[i+1]=a[i+1]-maxx;//寻找可行区间 
		b2[i+1]=a[i+1]-minn;
	}
	sort(b1+1,b1+n+1);
	sort(b2+1,b2+n+1);
	if(b1[1]>0||b2[n]<0){//答案左端点取并集 
		cout<<b2[n]-b1[1]+2<<endl;
	}
	else{
		cout<<b2[n]-b1[1]+1<<endl;
	}
	return 0;
}