CF C题代码求调/ll
  • 板块灌水区
  • 楼主3a51_
  • 当前回复15
  • 已保存回复15
  • 发布时间2022/5/14 00:35
  • 上次更新2023/10/28 01:31:10
查看原帖
CF C题代码求调/ll
327444
3a51_楼主2022/5/14 00:35

RT,WA on #3,样例过了,思路:二分答案+预处理

#include<bits/stdc++.h>
#define int long long
#define Tothetime_tolife using
#define AK namespace
#define IOI std
Tothetime_tolife AK IOI;
const int Mod1=998244353;
const int Mod2=1000000007;
int gcd(int a,int b){return __gcd(a,b);}
int lcm(int a,int b){return a*b/gcd(a,b);}
void read(int& x){char ch;int f=1;x=0;while(ch<'0'||ch>'9'){ch=getchar();if(ch=='-') f=-1;}while(ch>='0'&&ch<='9'){ch=getchar();x=x*10+ch-'0';}x*=f;}
void write(int x){if(x>9){write(x/10);}putchar(x%10+'0');return;}
void we(int x){write(x);printf("\n");}
void wk(int x){write(x);printf(" ");}
void wr(int x){write(x);}
void re(int x){read(x);}
const int N=200005;
int qz[N],hz[N],qz1[N],hz1[N],sum,tot;
string s;
int check(int x){
	int res=2147483647;
	for(int i=0;i<=x;i++){
		res=min(res,sum-qz[qz1[i+1]-1]-hz[hz1[x-i+1]+1]);
	}
	if(res>x) return 0;
	else return 1;
}
signed main(){
	int t;
	scanf("%lld",&t);
	while(t--){
		cin>>s;
		sum=0;tot=0;
		for(int i=0;i<s.size();i++){
			if(s[i]=='0'){
				sum++;
				qz[i]=qz[i-1]+1;
			}else{
				tot++;
				qz[i]=qz[i-1]; 
			}
		}
		for(int i=s.size()-1;i>=0;i--){
			if(s[i]=='0'){
				hz[i]=hz[i+1]+1;
			}else{
				hz[i]=hz[i+1]; 
			}
		}
		int cnt=0;
		for(int i=0;i<s.size();i++){
			if(s[i]=='1'){
				qz1[++cnt]=i;
			}
		}
		cnt=0;
		for(int i=s.size()-1;i>=0;i--){
			if(s[i]=='1'){
				hz1[++cnt]=i;
			}
		}
		if(sum==s.size() || tot==s.size()){
			printf("0\n");
			continue;
		}
		int l=0,r=s.size(),ans=0;
		while(l<=r)
		{
			int mid=(l+r)>>1;
			if(check(mid)){
				r=mid-1;
				ans=mid;
			}else{
				l=mid+1;
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}
//STO 来看我程序的人 Orz

2022/5/14 00:35
加载中...