80分求助
查看原帖
80分求助
244848
ricky_xmz楼主2021/7/3 21:14

#21-#25测试点TLE,求大佬指点

#include<bits/stdc++.h>
using namespace std;
int ans=-1;
vector<int> value,id,mid,lid,rid;
struct Node{
	int v,l,r;
	Node(int v0=0,int l0=-1,int r0=-1) : v(v0),l(l0),r(r0) {}
	bool operator < (const Node &b) const {
		return (v<b.v) || (v==b.v && l<b.l) || (v==b.v && l==b.l && r<b.r);
	}
};
map<Node,int> h[10000000];
int cnt;
int ID(Node u){
	int hash=((long long)u.v*100000000000000+(long long)u.l*10000000+u.r)%9999999;
	if(h[hash].count(u))
		return h[hash][u];
	return h[hash][u]=cnt++;
}
void dfs(int u,int &subtreesize){
	subtreesize=1; int x;
	if(lid[u]==-1 && rid[u]==-1){
		Node nd(value[u],-1,-1);
		id[u]=mid[u]=ID(nd);
		return;
	}
	Node nd(value[u]),mnd(value[u]);
	if(lid[u]!=-1){ dfs(lid[u],x); subtreesize+=x; }
	if(rid[u]!=-1){ dfs(rid[u],x); subtreesize+=x; }
	if(lid[u]!=-1){ nd.l=id[lid[u]]; mnd.r=mid[lid[u]]; }
	if(rid[u]!=-1){ nd.r=id[rid[u]]; mnd.l=mid[rid[u]]; }
	id[u]=ID(nd); mid[u]=ID(mnd);
	if(nd.l==mnd.l && nd.r==mnd.r)
		ans=max(ans,subtreesize);
}
int main(){
	int n;
	cin>>n;
	value.resize(n); id.resize(n); mid.resize(n);
	lid.resize(n); rid.resize(n);
	for(int i=0;i<n;i++)
		cin>>value[i];
	for(int i=0;i<n;i++){
		cin>>lid[i]>>rid[i];
		if(lid[i]>0) lid[i]--;
		if(rid[i]>0) rid[i]--;
	}
	int t; dfs(0,t);
	if(ans>0) cout<<ans;
	else cout<<1;
    return 0;
}
2021/7/3 21:14
加载中...