过了样例但是0pts求助/kk
查看原帖
过了样例但是0pts求助/kk
203008
山田リョウ楼主2021/10/15 23:34
#include<stdio.h>
#include<algorithm>
#include<map>
struct int128{
	unsigned long long a[2];
	int128 operator <<(const size_t&o)const{
		return (int128){a[0]<<o|a[1]>>64-o,a[1]<<o};
	}
	int128 operator |(const int128&o)const{
		return (int128){a[0]|o.a[0],a[1]|o.a[1]};
	}
	bool operator <(const int128&o)const{
		return a[0]==o.a[0]?a[1]<o.a[1]:a[0]<o.a[0];
	}
}name[51];int size[51],head[51],m,n;
struct{int v,nxt;}e[51];
inline bool cmp(int a,int b){return name[a]<name[b];}
void dfs(int x,int f){
	static int a[51];int tot=0;size[x]=1;name[x]={0,0};
	for(int i=head[x];~i;i=e[i].nxt)
		if(e[i].v!=f){
			dfs(e[i].v,x);
			size[x]+=size[e[i].v];
			a[tot++]=e[i].v;
		}
	std::sort(a,a+tot,cmp);
	for(int i=0;i<tot;++i)name[x]=name[x]<<(size[a[i]]<<1)|name[a[i]];
	name[x]=name[x]<<1|(int128){0,1};
}
int cent[2],tot;
void query(int x,int f){
	size[x]=1;
	bool flag=1;
	for(int i=head[x];~i;i=e[i].nxt)
		if(e[i].v!=f){
			query(e[i].v,x);
			size[x]+=size[e[i].v];
		}
	for(int i=head[x];~i;i=e[i].nxt)
		if(e[i].v!=f&&size[e[i].v]>(size[x]>>1)){flag=0;break;}
	if(flag&&n-size[x]<=(size[x]>>1))cent[tot++]=x;
}
int main(){
	std::map<int128,int> MAP;
	scanf("%d",&m);
	for(int k=1;k<=m;++k){
		scanf("%d",&n);
		for(int i=1;i<=n;++i)head[i]=-1;tot=0;
		int cnt=0;
		for(int i=0;i<n;++i){
			int x;scanf("%d",&x);
			if(x){
				e[cnt<<1]={x,head[i]},head[i]=cnt<<1;
				e[cnt<<1|1]={i,head[x]},head[x]=cnt<<1|1;
				++cnt;
			}
		}
		query(1,0);
		int128 NAME={0xffffffffffffffffull,0xffffffffffffffffull};
		for(int i=0;i<tot;++i){
			dfs(cent[i],0);
			if(name[cent[i]]<NAME)NAME=name[cent[i]];
		}
		if(MAP.find(NAME)!=MAP.end())printf("%d\n",MAP[NAME]);
		else printf("%d\n",MAP[NAME]=k);

	}
	return 0;
}
2021/10/15 23:34
加载中...