刚刚结束的CF C题求Hack
  • 板块题目总版
  • 楼主__vector__
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/5/14 00:40
  • 上次更新2023/10/28 01:31:09
查看原帖
刚刚结束的CF C题求Hack
507348
__vector__楼主2022/5/14 00:40

调了半天还是 WA on test#2

#include <bits/stdc++.h>
using namespace std;
namespace Main
{
	typedef long long ll;
	int t;
	const int maxn=2e5+5;
	char s[maxn];
	int n;
	int zerosum;
	int f[maxn],f2[maxn];
	inline int subtask1()
	{
		for(int i=0;i<=n+1;i++)
		{
			f[i]=f2[i]=0;
		}
		zerosum=0;
		int fir_min=0x3f3f3f3f,fir=0;
		int las_min=0x3f3f3f3f,las=n+1;
		for(int i=1;i<=n;i++)
		{
			if(s[i]=='0')
			{
				zerosum++;
			}
		}
		int del_1=0,ls=zerosum;
		int tmp_ls,tmp_del1;
		f[0]=zerosum;
		fir_min=f[0];
		tmp_ls=zerosum;
		tmp_del1=0;
		for(int i=1;i<=n;i++)
		{
			if(s[i]=='0')
			{
				ls--;
			}
			if(s[i]=='1')
			{
				del_1++;
			}
			f[i]=max(ls,del_1);
			if(f[i]<fir_min)
			{
				tmp_ls=ls;
				tmp_del1=del_1;
			}
			fir_min=min(fir_min,f[i]);
		}
		for(int i=0;i<=n;i++)
		{
			if(f[i]==fir_min)
			{
				fir=i;
				break;
			}
		}
		ls=tmp_ls;
		del_1=tmp_del1;
		las_min=min(las_min,max(ls,del_1));
		for(int i=n;i>fir;i--)
		{
			if(s[i]=='0')
			{
				ls--;
			}
			if(s[i]=='1')
			{
				del_1++;
			}
			f2[i]=max(ls,del_1);
			las_min=min(las_min,f2[i]);
		}
		return las_min;
	}
	inline int subtask2()
	{
		for(int i=0;i<=n+1;i++)
		{
			f[i]=f2[i]=0;
		}
		zerosum=0;
		int fir_min=0x3f3f3f3f,fir=0;
		int las_min=0x3f3f3f3f,las=n+1;
		for(int i=1;i<=n;i++)
		{
			if(s[i]=='0')
			{
				zerosum++;
			}
		}
		int del_1=0,ls=zerosum;
		int tmp_ls,tmp_del1;
		f2[n+1]=zerosum;
		las_min=f2[n+1];
		tmp_ls=zerosum;
		tmp_del1=0;
		for(int i=n;i>=1;i--)
		{
			if(s[i]=='0')
			{
				ls--;
			}
			if(s[i]=='1')
			{
				del_1++;
			}
			f2[i]=max(ls,del_1);
			if(f2[i]<las_min)
			{
				tmp_ls=ls;
				tmp_del1=del_1;
			}
			las_min=min(las_min,f2[i]);
		}
		for(int i=n+1;i>=1;i--)
		{
			if(f2[i]==las_min)
			{
				las=i;
				break;
			}
		}
		ls=tmp_ls;
		del_1=tmp_del1;
		fir_min=min(fir_min,max(ls,del_1));
		for(int i=1;i<las;i++)
		{
			if(s[i]=='0')
			{
				ls--;
			}
			if(s[i]=='1')
			{
				del_1++;
			}
			f[i]=max(ls,del_1);
			fir_min=min(fir_min,f[i]);
		}
		return fir_min;
	}
	void main()
	{
		scanf("%d",&t);
		while(t--)
		{
			scanf("%s",s+1);
			n=strlen(s+1);
			for(int i=0;i<=n+1;i++)
			{
				f[i]=f2[i]=0;
			}
			int a=subtask1();
			int b=subtask2();
			printf("%d\n",min(a,b));
		}
	}
}
int main()
{
	Main::main();
	return 0;
}
2022/5/14 00:40
加载中...