QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#764128#9565. Birthday GiftDixiky_215WA 7ms5920kbC++202.6kb2024-11-20 00:47:482024-11-20 00:47:57

Judging History

你现在查看的是最新测评结果

  • [2024-11-20 00:47:57]
  • 评测
  • 测评结果:WA
  • 用时:7ms
  • 内存:5920kb
  • [2024-11-20 00:47:48]
  • 提交

answer

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=2e6+7;
int t;
int n;
int dp1[MAXN][2];
int dp2[MAXN][2];
string a;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);

	cin>>t;
	while(t--)
	{
		cin>>a;
		n=a.size();
		a=' '+a;
		for(int i=0;i<=n;i++)
		{
			dp1[i][0]=dp1[i][1]=-1e9;
			dp2[i][0]=dp2[i][1]=1e9;
		}

		dp1[0][0]=dp1[0][1]=0;
		dp2[0][0]=dp2[0][1]=0;
		if(a[1]=='1') dp1[1][1]=dp2[1][1]=1;
		else if(a[1]=='0') dp1[1][0]=dp2[1][0]=1;
		else
		{
			dp1[1][1]=dp2[1][1]=1;
			dp1[1][0]=dp2[1][0]=1;
		}

		for(int i=2;i<=n;i++)
		{
			if(a[i-1]=='2'||a[i]==a[i-1]||a[i]=='2')
			{
				dp1[i][0]=max(dp1[i][0],dp1[i-2][0]);
				dp1[i][1]=max(dp1[i][1],dp1[i-2][1]);
				dp2[i][0]=min(dp2[i][0],dp2[i-2][0]);
				dp2[i][1]=min(dp2[i][1],dp2[i-2][1]);
			}
			if(a[i]=='2')
			{
				if(dp1[i-1][1]>0) dp1[i][0]=max(dp1[i][0],dp1[i-1][1]-1);
				if(dp1[i-1][1]>0&&dp1[i-1][1]>=-1e6) dp2[i][0]=min(dp2[i][0],dp1[i-1][1]-1);
				if(dp2[i-1][1]>0) dp2[i][0]=min(dp2[i][0],dp2[i-1][1]-1);
				dp1[i][1]=max(dp1[i][1],dp1[i-1][0]+1);
				dp2[i][1]=min(dp2[i][1],dp2[i-1][0]+1);

				if(dp1[i-1][0]>0) dp1[i][1]=max(dp1[i][1],dp1[i-1][0]-1);
				if(dp1[i-1][0]>0&&dp1[i-1][0]>=-1e6) dp2[i][1]=min(dp2[i][1],dp1[i-1][0]-1);
				if(dp2[i-1][0]>0) dp2[i][1]=min(dp2[i][1],dp2[i-1][0]-1);
				dp1[i][0]=max(dp1[i][0],dp1[i-1][1]+1);
				dp2[i][0]=min(dp2[i][0],dp2[i-1][1]+1);
			}
			else if(a[i]=='1')
			{
				if(dp1[i-1][1]>0) dp1[i][0]=max(dp1[i][0],dp1[i-1][1]-1);
				if(dp1[i-1][1]>0&&dp1[i-1][1]>=-1e6) dp2[i][0]=min(dp2[i][0],dp1[i-1][1]-1);
				if(dp2[i-1][1]>0) dp2[i][0]=min(dp2[i][0],dp2[i-1][1]-1);
				dp1[i][1]=max(dp1[i][1],dp1[i-1][0]+1);
				dp2[i][1]=min(dp2[i][1],dp2[i-1][0]+1);
			}
			else
			{
				if(dp1[i-1][0]>0) dp1[i][1]=max(dp1[i][1],dp1[i-1][0]-1);
				if(dp1[i-1][0]>0&&dp1[i-1][0]>=-1e6) dp2[i][1]=min(dp2[i][1],dp1[i-1][0]-1);
				if(dp2[i-1][0]>0) dp2[i][1]=min(dp2[i][1],dp2[i-1][0]-1);
				dp1[i][0]=max(dp1[i][0],dp1[i-1][1]+1);
				dp2[i][0]=min(dp2[i][0],dp2[i-1][1]+1);
			}
			if(dp2[i][0]==0) dp1[i][0]=max(dp1[i][0],0);
			if(dp2[i][1]==0) dp1[i][1]=max(dp1[i][1],0);
			if(dp1[i][0]==0) dp2[i][0]=0;
			if(dp1[i][1]==0) dp2[i][1]=0;
		}
		// for(int i=1;i<=n;i++) cerr<<i<<" "<<dp2[i][0]<<" "<<dp1[i][0]<<" "<<dp2[i][1]<<" "<<dp1[i][1]<<" sad"<<endl;
		int ans=n;
		for(int i=1;i<=n;i++)
		{
			int s2=min(dp2[i][0],dp2[i][1]);
			ans=min(ans,n-i+s2);

		}
		cout<<ans<<'\n';
	}
	return 0;
}
/*
1
0120120101
2

1
0210012101
*/

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 5920kb

input:

5
0110101
01020102
0000021111
1012121010
0100202010

output:

3
4
0
6
0

result:

ok 5 number(s): "3 4 0 6 0"

Test #2:

score: -100
Wrong Answer
time: 7ms
memory: 5544kb

input:

50000
1010110101
1010101010
0101010101
0101010010
0101010010
1010101010
0101001010
1010010010
0100101010
1010101001
1010100101
0101010100
0100101011
0101101010
1011010110
1011010101
1010010101
1010010010
0101010101
0010101010
0101011010
0100101010
1010101010
1010010101
1010101101
1101010101
10100101...

output:

0
10
10
4
4
10
0
4
4
6
2
8
4
2
4
4
2
4
10
8
2
4
10
2
4
8
2
8
8
4
8
4
4
6
4
4
4
6
10
10
2
6
0
10
8
10
0
10
10
10
4
10
8
10
0
8
4
0
8
2
8
0
6
2
8
10
4
10
10
2
10
2
10
8
6
4
2
8
8
0
8
10
8
10
8
10
2
6
10
4
10
8
10
4
10
6
10
10
10
6
6
6
4
10
10
10
2
2
8
10
6
10
10
8
4
10
6
10
2
2
8
2
10
4
6
0
10
4
6
2
1...

result:

wrong answer 13th numbers differ - expected: '2', found: '4'