90ptsMLE求助
查看原帖
90ptsMLE求助
239468
ctz2854楼主2023/7/16 19:00

rt

调了很久还是MLE

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN =5*1e5+5;
vector<int> G[MAXN];
ll a[MAXN],as[MAXN];
int s1,s2,n,p[70],W[MAXN][3];
bool vis[MAXN];
queue<int> q;
inline ll read()
{
	ll x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-'){f=-f;}ch=getchar();}
	while(isdigit(ch))x=(x<<3)+(x<<1)+1ll*(ch-48),ch=getchar();
	return x*f;
}
class Trie
{
	private:
		int root=1,T[MAXN*60][2],num[MAXN*60],t;
	public:
		ll res=0,ans;
		int tot=1;
		void insert(ll x,int id)
		{
			t=root;
			//memset(p,0,sizeof(p));
			for(int i=1;i<=65;i++) p[i]=(x&1),x>>=1;
			//for(int i=65;i>=1;i--) cout<<p[i];
			//cout<<endl;
			for(int i=65;i>=1;i--)
			{
				 if(!T[t][p[i]]) T[t][p[i]]=++tot;
				 t=T[t][p[i]];
			}
			num[t]=id;
		}
		void query(ll x,int id)
		{
			t=root;
			//memset(p,0,sizeof(p));
			for(int i=1;i<=65;i++) p[i]=!(x&1),x>>=1;
			//for(int i=65;i>=1;i--) cout<<p[i];
			//cout<<endl;
			ans=0;
			for(int i=65;i>=1;i--)
			{
				 if(!T[t][p[i]]) t=T[t][p[i]^1];
				 else t=T[t][p[i]],ans+=1ll*(1ll<<(i-1));
			}
			if(ans>res) res=ans,s1=id,s2=num[t];
		}
}S;
class sTrie
{
	private:
		int root=1,tot=1,t,T[MAXN*60][2];	
		ll ans=0;
	public:
		ll res=0;
		void insert(ll x)
		{
			t=root;
			for(int i=1;i<=65;i++) p[i]=(x&1),x>>=1;
			for(int i=65;i>=1;i--)
			{
				 if(!T[t][p[i]]) T[t][p[i]]=++tot;
				 t=T[t][p[i]];
			}
		}
		void Ins(int x)
		{
			q.push(x);
			while(!q.empty())
			{
				int u=q.front();q.pop();
				//cout<<u<<endl;
				insert(a[u]),query(a[u]);
				for(int i=0;i<G[u].size();i++)q.push(G[u][i]);

			}
			//cout<<endl;
		}
		void query(ll x)
		{
			t=root;
			for(int i=1;i<=65;i++) p[i]=!(x&1),x>>=1;
			ans=0;
			for(int i=65;i>=1;i--)
			{
				if(!T[t][p[i]]) t=T[t][p[i]^1];
				else t=T[t][p[i]],ans+=1ll*(1ll<<(i-1));
			}
			if(ans>res) res=ans;
		}
		ll GetAns()
		{
			return res;
		}
}D[3];
void dfs(int x)
{
	
	for(int i=0;i<G[x].size();i++) 
	{
		
		dfs(G[x][i]);
		if(vis[G[x][i]]) W[x][++W[x][0]]=G[x][i];
	}
	if(x==s1||x==s2||W[x][0]) vis[x]=1;
}
void dfs1(int x,int flag)
{
	//cout<<x<<" "<<D[1].GetAns()<<" "<<D[2].GetAns()<<" "<<flag<<endl;
	if(!flag) as[x]=max(D[1].GetAns(),D[2].GetAns());
	else as[x]=D[flag].GetAns();
	if(!W[x][0]) return;
	if(W[x][0]==2) 
	{
		D[1].insert(a[x]),D[2].insert(a[x]);
		D[1].query(a[x]),D[2].query(a[x]);
		int cnt=0;
		for(int i=0;i<G[x].size();i++)
		{
			int y=G[x][i];
			if(!vis[y]) D[1].Ins(y),D[2].Ins(y);
			else D[++cnt].Ins(y);
		}
		dfs1(W[x][0],2),dfs1(W[x][1],1);
	}
	else if(!flag)
	{
		D[1].insert(a[x]),D[2].insert(a[x]);
		D[1].query(a[x]),D[2].query(a[x]);
		for(int i=0;i<G[x].size();i++)
		{
			int y=G[x][i];
			if(!vis[y]) D[1].Ins(y),D[2].Ins(y);
		}
		dfs1(W[x][0],flag);
	}
	else
	{
		D[flag].insert(a[x]);
		D[flag].query(a[x]);
		for(int i=0;i<G[x].size();i++)
		{
			int y=G[x][i];
			if(!vis[y]) D[flag].Ins(y);
		}
		dfs1(W[x][0],flag);
	}
}
int main()
{
	freopen("xor.in","r",stdin);
	freopen("xor.out","w",stdout);	
	n=read();
	for(int i=2;i<=n;i++) G[read()].push_back(i);
	for(int i=1;i<=n;i++) a[i]=read(),S.insert(a[i],i),S.query(a[i],i);
	dfs(1);
	//for(int i=1;i<=n;i++) if(vis[i]) cout<<i<<endl;
	for(int i=1;i<=n;i++) if(!vis[i])as[i]=S.res;	
	
	dfs1(1,0);
	//cout<<as[2]<<endl;	
	for(int i=1;i<=n;i++) printf("%lld\n",as[i]);
	return 0;
}
2023/7/16 19:00
加载中...