全re的史山代码玄关求调
  • 板块灌水区
  • 楼主_klee_
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/7/24 16:02
  • 上次更新2024/7/24 16:44:53
查看原帖
全re的史山代码玄关求调
737325
_klee_楼主2024/7/24 16:02

rt

辛苦大佬们了

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9')
	{
		if (ch=='-') f=-1;
		ch=getchar();
	}
	while (ch>='0'&&ch<='9')
	{
		x=x*10+ch-48;
		ch=getchar();
	}
	return x*f;
}
string s;
int cnt,f[N][3],g[N][3];
void dfs(int x)
{
	if(s[x]=='0') f[x][0]=g[x][0]=1;
	dfs(++cnt);
	if(s[x]=='1')
	{
		cnt++;
		dfs(cnt);
		f[x][0]=min(f[cnt][1],f[cnt][2])+1;
		f[x][1]=min(f[cnt][0],f[cnt][2]);
		f[x][2]=min(f[cnt][0],f[cnt][1]);
		
		g[x][0]=min(g[cnt][1],g[cnt][2])+1;
		g[x][1]=min(g[cnt][0],g[cnt][2]);
		g[x][2]=min(g[cnt][0],g[cnt][1]);
	}
	else if(s[x]=='2')
	{
		cnt++;
		int k=++cnt;
		dfs(k);
		f[x][0]+=min(f[x+1][1]+f[k][2],f[x+1][2]+f[k][1])+1;
		f[x][1]+=min(f[x+1][0]+f[k][2],f[x+1][2]+f[k][0]);
		f[x][2]+=min(f[x+1][0]+f[k][0],f[x+1][1]+f[k][0]);
		
		g[x][0]+=max(g[x+1][1]+g[k][2],g[x+1][2]+g[k][1])+1;
		g[x][1]+=max(g[x+1][0]+g[k][2],g[x+1][2]+g[k][0]);
		g[x][2]+=max(g[x+1][0]+g[k][0],g[x+1][1]+g[k][0]);
	}
	return;
}
int main( )
{
	cin>>s;
	dfs(cnt);
	cout<<max(g[0][0],max(g[0][1],g[0][2]))<<" "<<min(f[0][0],min(f[0][1],f[0][2]));
 	return 0;
}
2024/7/24 16:02
加载中...