QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#371238 | #8012. Jumping Lights | ucup-team134 | WA | 11ms | 32244kb | C++17 | 3.4kb | 2024-03-30 03:00:00 | 2024-03-30 03:00:00 |
Judging History
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'