QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#766026#9605. 新生舞会yhddd40 99ms18020kbC++203.1kb2024-11-20 15:58:242024-11-20 15:58:28

Judging History

你现在查看的是最新测评结果

  • [2024-11-20 15:58:28]
  • 评测
  • 测评结果:40
  • 用时:99ms
  • 内存:18020kb
  • [2024-11-20 15:58:24]
  • 提交

answer

#include<bits/stdc++.h>
#define mod 998244353ll
#define pii pair<int,int>
#define fi first
#define se second
#define mems(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define db double
using namespace std;
const int maxn=200010;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
	return x*f;
}
bool Mbe;

int n,ans;
int head[maxn],tot;
struct nd{
	int nxt,to;
}e[maxn<<1];
void add(int u,int v){e[++tot]={head[u],v};head[u]=tot;}
int fa[maxn],siz[maxn],son[maxn];
#define ls tree[nd][0]
#define rs tree[nd][1]
int tree[maxn<<1][2],tag[maxn<<1];
int rt[maxn],iidx;
bitset<maxn<<1> vis;
int st[maxn],tp;
void clr(int nd){
	ls=rs=0,tag[nd]=0;
	vis.reset(nd);st[++tp]=nd;
}
int newnode(){
	if(tp)return st[tp--];
	return ++iidx;
}
void up(int nd){
	vis.set(nd,vis.test(ls)&vis.test(rs));
}
void modif(int nd,int x,int d=20){
	// cout<<nd<<" "<<x<<" "<<d<<" "<<((x>>d)&1)<<" "<<ls<<" "<<rs<<" m\n";
	if((x>>d)&1)swap(ls,rs);
	tag[nd]^=x;
}
void down(int nd,int d=20){
	if(ls)modif(ls,tag[nd],d-1);
	if(rs)modif(rs,tag[nd],d-1);
	tag[nd]=0;
}
void insert(int &nd,int x,int d=20){
	if(!nd)nd=newnode();
	if(!(~d)){
		vis.set(nd);
		return ;
	}
	if(tag[nd])down(nd,d);
	int v=(x>>d)&1;
	insert(tree[nd][v],x,d-1);
	up(nd);
}
int merge(int u,int v,int d=20){
	if(!u||!v)return u|v;
	if(!(~d)){
		clr(v);
		return u;
	}
	if(tag[u])down(u,d);
	if(tag[v])down(v,d);
	tree[u][0]=merge(tree[u][0],tree[v][0],d-1);
	tree[u][1]=merge(tree[u][1],tree[v][1],d-1);
	up(u);clr(v);
	return u;
}
int quemex(int nd,int d=20){
	if(!nd||!(~d))return 0;
	if(tag[nd])down(nd,d);
	// cout<<nd<<" "<<tag[nd]<<" "<<d<<" "<<ls<<" "<<rs<<"\n";
	if(vis.test(ls))return (1<<d)+quemex(rs,d-1);
	return quemex(ls,d-1);
}
int id[maxn],idx;
int sg[maxn],sum[maxn];
void work(){
	n=read();
	for(int i=1;i<=n;i++)head[i]=0;tot=0;
	for(int i=2;i<=n;i++){
		fa[i]=read();
		add(fa[i],i);
	}
	while(iidx)clr(iidx),iidx--;tp=0;
	for(int u=n;u;u--){
		siz[u]=1,son[u]=0;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].to;
			siz[u]+=siz[v];
			if(siz[v]>=siz[son[u]])son[u]=v;
		}
	}
	for(int i=1;i<=n;i++)head[i]=0;tot=0;
	for(int i=2;i<=n;i++)if(son[fa[i]]!=i)add(fa[i],i);
	for(int i=1;i<=n;i++)if(son[i])add(i,son[i]);
	for(int i=1;i<=n;i++)sg[i]=sum[i]=rt[i]=0;
	id[++idx]=1;
	while(idx){
		int u=id[idx];
		if(head[u]){
			int v=e[head[u]].to;
			head[u]=e[head[u]].nxt;
			id[++idx]=v;
		}
		else{
			insert(rt[u],0);
			modif(rt[u],sum[u]);
			sg[u]=quemex(rt[u]);
			// cout<<u<<" "<<sg[u]<<"\n";
			if(fa[u]){
				modif(rt[u],sg[u]);
				rt[fa[u]]=merge(rt[fa[u]],rt[u]);
				sum[fa[u]]^=sg[u];
			}
			idx--;
		}
	}
	ans^=sg[1];
	// cout<<sg[1]<<"\n";
}

// \
444

bool Med;
int T;
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	
	cerr<<(&Mbe-&Med)/1048576.0<<" MB\n";
	
	T=read();
	while(T--)work();
	printf("%lld\n",ans);
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 0ms
memory: 10096kb

input:

12
13
1 2 1 4 2 5 3 3 2 9 6 4
392
1 2 2 4 4 3 3 6 9 10 9 11 13 14 15 15 17 18 19 20 6 21 23 12 24 26 27 28 29 30 31 32 33 31 34 33 36 9 38 40 41 25 42 44 45 46 47 48 49 50 51 52 53 21 32 52 54 58 59 60 53 61 63 64 65 66 67 68 69 70 4 1 71 74 75 76 77 78 79 80 81 52 82 55 84 86 84 87 89 90 91 92 93 1...

output:

1875

result:

ok 1 number(s): "1875"

Test #2:

score: 10
Accepted
time: 4ms
memory: 10312kb

input:

1
5000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 5 21 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 79 85 87 88 89 90 91 92 93 94 95 96 97 98 99 100 10...

output:

4950

result:

ok 1 number(s): "4950"

Test #3:

score: 10
Accepted
time: 3ms
memory: 8148kb

input:

1
5000
1 1 2 1 2 2 3 4 9 10 9 12 13 10 15 12 14 14 18 20 19 22 19 20 21 24 26 27 25 30 30 32 33 33 33 32 34 35 38 40 39 38 40 43 43 44 43 46 48 50 50 48 50 53 53 52 56 56 57 56 57 60 61 61 61 62 66 65 69 67 71 70 71 73 75 73 73 75 78 80 78 80 82 80 82 84 86 85 89 86 87 92 92 92 95 94 95 95 95 100 10...

output:

3204

result:

ok 1 number(s): "3204"

Subtask #2:

score: 0
Runtime Error

Test #4:

score: 0
Runtime Error

input:

15
1
5
1 1 3 3
10603
1 2 2 1 5 3 6 3 2 7 6 6 10 5 4 16 4 16 18 4 11 22 8 14 2 26 22 9 10 20 28 26 1 27 8 35 3 4 6 25 14 9 33 44 15 26 28 34 24 18 48 5 33 11 37 32 19 14 41 6 46 60 8 25 62 32 59 27 54 50 62 44 51 18 53 46 42 31 26 11 78 71 40 60 2 13 35 84 34 76 51 88 33 13 88 85 80 70 21 74 54 79 75...

output:


result:


Subtask #3:

score: 30
Accepted

Dependency #1:

100%
Accepted

Test #6:

score: 30
Accepted
time: 86ms
memory: 14480kb

input:

16
4
1 1 3
9
1 2 3 4 5 6 7 8
58
1 2 2 4 5 6 7 8 9 2 10 12 13 5 8 14 17 4 18 20 21 22 8 10 4 23 27 5 26 21 20 28 26 33 35 36 37 38 22 39 41 42 43 44 34 45 47 3 31 48 51 52 53 54 44 44 21
30
1 2 1 4 5 2 6 8 8 2 11 5 9 13 10 16 17 18 12 10 11 19 12 23 23 3 16 26 29
36
1 1 1 2 2 1 2 3 1 10 6 3 12 3 8 9 ...

output:

20841

result:

ok 1 number(s): "20841"

Test #7:

score: 30
Accepted
time: 88ms
memory: 17508kb

input:

1
200000
1 2 3 4 5 6 7 7 9 10 11 12 13 14 15 13 16 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100...

output:

195053

result:

ok 1 number(s): "195053"

Test #8:

score: 30
Accepted
time: 88ms
memory: 16604kb

input:

1
200000
1 1 2 2 2 4 4 4 6 10 9 10 11 12 13 15 15 18 19 19 19 20 20 22 23 23 23 24 26 27 28 28 29 34 31 35 33 37 35 40 37 39 43 43 43 46 46 48 48 50 48 52 49 50 53 54 54 56 57 56 61 60 59 60 61 65 64 64 65 69 70 72 73 74 72 73 75 78 76 77 80 79 80 81 81 82 86 84 87 90 88 91 93 93 94 94 94 97 95 100 ...

output:

127754

result:

ok 1 number(s): "127754"

Test #9:

score: 30
Accepted
time: 94ms
memory: 15064kb

input:

1
200000
1 2 3 4 1 3 4 4 4 1 3 2 3 3 3 5 2 1 4 5 4 3 5 3 3 2 2 1 1 2 4 2 4 3 3 1 1 2 4 5 5 5 5 2 1 5 3 4 1 5 2 3 4 5 2 3 3 3 1 2 4 2 2 1 1 2 4 1 3 4 1 4 3 4 4 2 1 4 4 5 1 2 1 1 3 2 4 3 3 3 1 2 3 4 3 1 5 5 2 3 2 2 4 2 2 5 2 2 3 5 1 2 2 1 5 5 3 4 2 1 2 5 3 4 5 5 4 5 1 5 3 3 4 3 5 5 4 2 5 5 2 2 3 3 4 2...

output:

10

result:

ok 1 number(s): "10"

Test #10:

score: 30
Accepted
time: 78ms
memory: 14380kb

input:

1
200000
1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 ...

output:

66

result:

ok 1 number(s): "66"

Test #11:

score: 30
Accepted
time: 99ms
memory: 13740kb

input:

1
200000
1 2 2 1 5 3 2 7 4 1 5 10 2 3 15 16 13 1 12 13 19 13 19 16 23 9 10 1 23 26 30 7 25 16 25 36 16 27 10 39 40 20 6 5 30 3 46 41 35 30 24 28 28 8 38 25 32 38 29 21 56 17 24 38 5 7 62 58 13 8 11 45 47 55 55 12 64 8 55 7 5 31 73 20 85 83 44 74 58 65 57 66 27 47 66 56 90 39 96 15 37 14 30 61 96 73 ...

output:

8192

result:

ok 1 number(s): "8192"

Test #12:

score: 30
Accepted
time: 86ms
memory: 18020kb

input:

1
200000
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 25 62 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100...

output:

199948

result:

ok 1 number(s): "199948"

Subtask #4:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

0%