蒟蒻求助,本地oj已ac提交爆零
查看原帖
蒟蒻求助,本地oj已ac提交爆零
472963
PMZG楼主2021/3/14 10:43

按照大佬提示数组已开大,一片wa

#include <bits/stdc++.h>
using namespace std;
char a[1000005];
int f[1000005][3],ff[1000005][3],p,t=1;
struct tr{
	int l;
	int r;
	int fa=0;
}b[1000005];
queue <char> q;
int dp0(int x);
int dp1(int x);
int dp2(int x);
int ddp0(int x);
int ddp1(int x);
int ddp2(int x);
void bt()//建树 
{
	if(q.front()=='0')
	{
		b[t].l=0;b[t].r=0;//此处没有操作 
	}
	if(q.front()=='1')
	{
	    int x=t;
		b[t].r=0;
		b[t].l=++t;
		b[t].fa=x; 
		q.pop();
		bt();
	}
	if(q.front()=='2')
	{
		int x=t;
		b[x].l=++t;
		b[t].fa=x;
		q.pop();
		bt();
		b[x].r=++t;
		b[t].fa=x;
        q.pop();
		bt();
	}
}
int dp0(int x)
{
	if(f[x][0]!=-1)return f[x][0];
	if(x==0)
	{
		f[x][0]=0;
		return f[x][0];
	}
	f[x][0]=0;
	f[x][0]+=max(dp1(b[x].l)+dp2(b[x].r),dp2(b[x].l)+dp1(b[x].r));
    f[x][0]++;
    return f[x][0];
} 
int dp1(int x)
{
	if(f[x][1]!=-1)return f[x][1];
	if(x==0)
	{
		f[x][1]=0;
		return f[x][1];
	} 
	f[x][1]=0;
	f[x][1]+=max(dp0(b[x].l)+dp2(b[x].r),dp2(b[x].l)+dp0(b[x].r));
	return f[x][1];
} 
int dp2(int x)
{
	if(f[x][2]!=-1)return f[x][2];
	if(x==0)
	{
		f[x][2]=0;
		return f[x][2];
	} 
	f[x][2]=0;
	f[x][2]+=max(dp0(b[x].l)+dp1(b[x].r),dp1(b[x].l)+dp0(b[x].r));
	return f[x][2];
} 
int ddp0(int x)
{
	if(ff[x][0]!=-1)return ff[x][0];
	if(x==0)
	{
		ff[x][0]=0;
		return ff[x][0];
	}
	ff[x][0]=0;
	ff[x][0]+=min(ddp1(b[x].l)+ddp2(b[x].r),ddp2(b[x].l)+ddp1(b[x].r));
    ff[x][0]++;
    return ff[x][0];
} 
int ddp1(int x)
{
	if(ff[x][1]!=-1)return ff[x][1];
	if(x==0)
	{
		ff[x][1]=0;
		return ff[x][1];
	} 
	ff[x][1]=0;
	ff[x][1]+=min(ddp0(b[x].l)+ddp2(b[x].r),ddp2(b[x].l)+ddp0(b[x].r));
	return ff[x][1];
} 
int ddp2(int x)
{
	if(ff[x][2]!=-1)return ff[x][2];
	if(x==0)
	{
		ff[x][2]=0;
		return ff[x][2];
	} 
	ff[x][2]=0;
	ff[x][2]+=min(ddp0(b[x].l)+ddp1(b[x].r),ddp1(b[x].l)+ddp0(b[x].r));
	return ff[x][2];
}
int main()
{
	char c;
	while(scanf("%c",&c)!=EOF)
	  a[++p]=c;
	p--;
	for(int i=1;i<=p;i++)
	  q.push(a[i]);
	bt();
    memset(f,-1,sizeof(f));
    memset(ff,-1,sizeof(ff));
    cout<<max(max(dp0(1),dp1(1)),dp2(1))<<" ";
    cout<<min(min(ddp0(1),ddp1(1)),ddp2(1));
    return 0;
}
2021/3/14 10:43
加载中...