MLE20pts求助
查看原帖
MLE20pts求助
203008
YamadaRyou楼主2021/10/16 14:10

终于不再WA了,但是MLE了一片。。。

#include<stdio.h>
#include<algorithm>
#include<map>
struct int128{
	unsigned long long a,b;
	int128 operator <<(const size_t&o)const{
		return (o<64)?(int128){a<<o|b>>64-o,b<<o}:(int128){b<<o-64,0};
	}
	int128 operator |(const int128&o)const{
		return (int128){a|o.a,b|o.b};
	}
	bool operator <(const int128&o)const{
		return a==o.a?b<o.b:a<o.a;
	}
}name[51];int size[51],head[51],m,n;
void print(unsigned long long x,int cnt){
    if(cnt){
        print(x>>1,cnt-1);
        putchar((x&1)^48);
    }
}
void print(int128 x,int cnt){
	if(cnt>64)print(x.a,cnt-64),print(x.b,64);
	else print(x.b,cnt);
}
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];
		}
	for(int i=head[x];~i;i=e[i].nxt)if(e[i].v!=f)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;
	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];
			weight=size[e[i].v]>weight?size[e[i].v]:weight;
		}
	if((weight<<1)<=n&&n<=(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=1;i<=n;++i){
			int x;scanf("%d",&x);
			if(x){
				e[cnt]={x,head[i]},head[i]=cnt++;
				e[cnt]={i,head[x]},head[x]=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/16 14:10
加载中...