求助抱灵
查看原帖
求助抱灵
227728
冰糖鸽子TJ鸽子协会楼主2020/10/28 15:31

RT,全WA


// Problem: P2585 [ZJOI2006]三色二叉树
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2585
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
int n,sum,f[600000][10];
string s;
struct node
{
	int l,r;
}t[600000];
void buildt(int now)
{
	sum++;
	if(s[now]=='0'){return;}
	if(s[now]=='1'){t[now].l=now+1;buildt(now+1);}
	else if(s[now]=='2'){t[now].l=now+1;buildt(now+1);t[now].r=sum+1;buildt(sum+1);}
}
int f_ans(bool x)
{
	memset(f,0,sizeof(f));
	if(!x)
	{
		for(int i=sum;i>0;i--)
		{
			f[i][0]=max(f[t[i].l][1]+f[t[i].r][0],f[t[i].l][0]+f[t[i].r][1]);
			f[i][1]=f[t[i].l][0]+f[t[i].r][0]+1;
		}
		return max(f[1][1],f[1][0]);
	}
	else
	{
		for(int i=sum;i>0;i--)
		{
			f[i][0]=min(f[t[i].l][1]+f[t[i].r][0],f[t[i].l][0]+f[t[i].r][1]);
			f[i][1]=f[t[i].l][0]+f[t[i].r][0]+1;
		}
		return min(f[1][1],f[1][0]);
	}
}
int main()
{
	cin>>s;
	buildt(0);
	cout<<f_ans(0)<<' '<<f_ans(1);
	return 0;
}
2020/10/28 15:31
加载中...