QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#371238#8012. Jumping Lightsucup-team134WA 11ms32244kbC++173.4kb2024-03-30 03:00:002024-03-30 03:00:00

Judging History

This is the latest submission verdict.

  • [2024-03-30 03:00:00]
  • Judged
  • Verdict: WA
  • Time: 11ms
  • Memory: 32244kb
  • [2024-03-30 03:00:00]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
#define pb push_back

const int N=600050;
vector<int> E[N];
vector<int> cand[N];
int cnt[N],par[N];
bool mark[N],leaf[N];
int lvs[N],mkl[N];

void AddEdge(int u,int v){
	E[u].pb(v);
	E[v].pb(u);
}

void DFS(int u,int p){
	par[u]=p;
	for(int v:E[u]){
		if(v!=p){
			DFS(v,u);
			if(E[v].size()==1){
				lvs[u]++;
				leaf[v]=true;
			}else{
				cand[u].pb(v);
			}
		}
	}
}

int tme;
int when[N];
bool lzy[N];

int ans[2],n,q;
void Mark(int x){
	if(leaf[x]){
		bool mrk;
		if(when[x]<when[par[x]]){
			mrk=lzy[par[x]];
		}else{
			mrk=mark[x];
		}
		if(!mrk){
			when[x]=++tme;
			mark[x]=true;
			ans[x>n]++;
			mkl[par[x]]++;
			cnt[par[x]]++;
		}
	}else{
		if(!mark[x]){
			mark[x]=true;
			ans[x>n]++;
			if(par[x]){
				cnt[par[x]]++;
			}
		}
	}
}
void Unmark(int x){
	if(leaf[x]){
		bool mrk;
		if(when[x]<when[par[x]]){
			mrk=lzy[par[x]];
		}else{
			mrk=mark[x];
		}
		if(mrk){
			when[x]=++tme;
			mark[x]=false;
			ans[x>n]--;
			mkl[par[x]]--;
			cnt[par[x]]--;
		}
	}else{
		if(mark[x]){
			mark[x]=false;
			ans[x>n]--;
			if(par[x]){
				cand[par[x]].pb(x);
				cnt[par[x]]--;
			}
		}
	}
}

void MarkLeaves(int x){
	ans[x<=n]+=lvs[x]-mkl[x];
	cnt[x]+=lvs[x]-mkl[x];
	when[x]=++tme;
	lzy[x]=true;
	lvs[x]=mkl[x];
}
void UnmarkLeaves(int x){
	when[x]=++tme;
	ans[x<=n]-=mkl[x];
	cnt[x]-=mkl[x];
	mkl[x]=0;
	lzy[x]=false;
}

int Get(int x){
	int ans=cnt[x];
	if(mark[par[x]])ans++;
	return ans;
}

bool GetMark(int x){
	if(leaf[x]){
		bool mrk;
		if(when[x]<when[par[x]]){
			mrk=lzy[par[x]];
		}else{
			mrk=mark[x];
		}
		return mrk;
	}else{
		return mark[x];
	}
}

const int Q=1000050;
int t[Q],x[Q],sol[Q];
int main(){
	scanf("%i %i",&n,&q);
	for(int i=1;i<n;i++){
		int u,v;
		scanf("%i %i",&u,&v);
		AddEdge(u,v+n);
		AddEdge(u+n,v);
	}
	DFS(1,0);
	DFS(n+1,0);
	for(int i=1;i<=q;i++){
		scanf("%i",&t[i]);
		if(t[i]!=2)scanf("%i",&x[i]);
	}


	t[++q]=2;
	int p=0;
	vector<int> edge;
	for(int i=1,j;i<=q;i=j+1){
		for(j=i;t[j]!=2;j++);
		vector<int> nodes;
		for(int k=i;k<j;k++){
			if(t[k]==0){
				Unmark(x[k]+p*n);
			}else{
				Mark(x[k]+p*n);
			}
			sol[k]=ans[p];
			nodes.pb(x[k]+p*n);
		}
		vector<int> tmp;
		for(int x:nodes){
			if(mark[x]){
				edge.pb(x);
			}else{
				if(!leaf[x]){
					UnmarkLeaves(x);
				}
				int y=par[x];
				if(!y||!mark[y])continue;
				//printf("Inspect parent %i\n",y);
				if(Get(y)==0){
					Unmark(y);
					//printf("Unmarking parent %i\n",y);
				}
			}
		}
		for(int x:nodes){
			if(!mark[x]){
				if(Get(x)>0){
					tmp.pb(x);
				}
			}
		}
		p^=1;
		vector<int> newEdge;
		for(int x:tmp){
			if(!mark[x]){
				Mark(x);
				newEdge.pb(x);
			}
		}
		for(int x:edge){
			if(mark[x]){
				//printf("Expanding %i  sz:%i\n",x,cand[x].size());
				for(int y:cand[x]){
					if(!mark[y]){
						Mark(y);
						newEdge.pb(y);
					}
				}
				cand[x].clear();
				if(par[x]&&!mark[par[x]]){
					Mark(par[x]);
					newEdge.pb(par[x]);
				}
				MarkLeaves(x);
			}
		}
		edge=newEdge;
		sol[j]=ans[p];
		// for(int z=1;z<=n;z++)printf("%i ",GetMark(z));printf("\n");
		// for(int z=n+1;z<=n+n;z++)printf("%i ",GetMark(z));printf("\n");
	}
	for(int i=1;i<q;i++){
		printf("%i%c",sol[i],i==q-1?'\n':' ');
	}
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 11ms
memory: 32244kb

input:

8 8
1 2
2 3
2 4
1 5
5 6
5 7
5 8
1 1
2
2
0 1
0 3
0 4
0 5
2

output:

1 2 6 5 4 3 3 1

result:

ok 8 numbers

Test #2:

score: 0
Accepted
time: 4ms
memory: 32236kb

input:

4 5
1 2
1 3
2 4
1 2
2
0 4
2
2

output:

1 2 1 2 2

result:

ok 5 number(s): "1 2 1 2 2"

Test #3:

score: -100
Wrong Answer
time: 0ms
memory: 32112kb

input:

1000 1000
471 906
653 752
346 148
764 837
22 863
416 906
836 863
784 752
694 346
918 635
963 863
152 863
221 342
473 752
250 635
323 643
102 643
944 833
262 752
185 150
82 342
142 342
383 635
1000 342
30 752
713 837
513 635
12 150
181 346
138 752
661 150
435 342
246 150
387 643
561 635
41 833
797 34...

output:

1 1 2 115 114 118 117 215 214 308 307 605 604 607 606 707 706 901 900 903 902 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 1000 999 999 998 1000 999 1000 999 1000 999 1000 999 1000 999 999 998 1000 999 1000 999 1000 999 1000 999...

result:

wrong answer 8th numbers differ - expected: '103', found: '215'