CF WA:
Test: #4, time: 1390 ms., memory: 93848 KB, exit code: 0, checker exit code: 1, verdict: WRONG_ANSWER
Checker Log
wrong answer 84870th numbers differ - expected: '2', found: '3'
代码:
#include<bits/stdc++.h>
#define int long long
#define OK puts("OK");
using namespace std;
int n,q,dep[200001],dfn[200001],siz[200001],fa[200001],ans[200001],cnt=1,record[200001];
vector<int> line[200001];
void link(int from,int to){
line[from].push_back(to);
}
struct query{
int k,id;
vector<int> a;
};
vector<query> qr[200001];
struct segment_tree{
int tree[800001],lazy[800001];
void pushup(int index){
tree[index]=max(tree[index<<1],tree[index<<1|1]);
}
void build(int index,int left,int right){
// printf("%d %d %d\n",index,left,right);
if(left==right){
tree[index]=dep[left];
return;
}
int mid=(left+right)>>1;
build(index<<1,left,mid);
build(index<<1|1,mid+1,right);
pushup(index);
}
void pushdown(int index){
tree[index<<1]+=lazy[index];
tree[index<<1|1]+=lazy[index];
lazy[index<<1]+=lazy[index];
lazy[index<<1|1]+=lazy[index];
lazy[index]=0;
}
void update(int gleft,int gright,int x,int index,int left,int right){
if(right<gleft||gright<left){
return;
}
if(gleft<=left&&right<=gright){
tree[index]+=x;
lazy[index]+=x;
return;
}
int mid=(left+right)>>1;
pushdown(index);
update(gleft,gright,x,index<<1,left,mid);
update(gleft,gright,x,index<<1|1,mid+1,right);
pushup(index);
}
int search(int gleft,int gright,int index,int left,int right){
if(right<gleft||gright<left){
return 0;
}
if(gleft<=left&&right<=gright){
return tree[index];
}
int mid=(left+right)>>1;
pushdown(index);
return max(search(gleft,gright,index<<1,left,mid),search(gleft,gright,index<<1|1,mid+1,right));
}
}tr;
int dfs(int now,int d,int pre){
fa[now]=pre;
dfn[now]=cnt;//printf("dfn %d %d\n",now,dfn[now]);
dep[dfn[now]]=d;//printf("dep %d %d\n",dfn[now],dep[dfn[now]]);
siz[now]=1;
for(int i=0;i<line[now].size();i++){
if(line[now][i]==pre){
continue;
}
cnt++;
siz[now]+=dfs(line[now][i],d+1,now);
}
return siz[now];
}
void dfs2(int now,int pre){
if(now!=1){
tr.update(dfn[now],dfn[now]+siz[now]-1,-1,1,1,n);
tr.update(1,dfn[now]-1,1,1,1,n);
tr.update(dfn[now]+siz[now],n,1,1,1,n);
// printf("%d-%d %d-%d +1 %d-%d -1\n",1,dfn[now]-1,dfn[now]+siz[now],n,dfn[now],dfn[now]+siz[now]-1);
}
for(int i=0;i<qr[now].size();i++){
for(int j=0;j<qr[now][i].k;j++){
if(dfn[qr[now][i].a[j]]<=dfn[now]&&dfn[now]<=dfn[qr[now][i].a[j]]+siz[qr[now][i].a[j]]-1){
int l=0,r=line[qr[now][i].a[j]].size()-1;
while(l<r){
int mid=(l+r)>>1;
if(dfn[line[qr[now][i].a[j]][mid]]<=dfn[now]){
l=mid+1;
}
else{
r=mid;
}
}
// printf("%d %d %d %d\n",l,r,dfn[line[qr[now][i].a[j]][l]],dfn[now]);
if(l!=line[qr[now][i].a[j]].size()-1||dfn[line[qr[now][i].a[j]][l]]>dfn[now]){
l--;
}
tr.update(1,dfn[line[qr[now][i].a[j]][l]]-1,-n,1,1,n);
tr.update(dfn[line[qr[now][i].a[j]][l]]+siz[line[qr[now][i].a[j]][l]],n,-n,1,1,n);
// printf("del %d %d\n",1,dfn[line[qr[now][i].a[j]][l]]-1);
// printf("del %d %d\n",dfn[line[qr[now][i].a[j]][l]]+siz[line[qr[now][i].a[j]][l]],n);
// printf("%d\n",line[qr[now][i].a[j]][l]);
}
else{
tr.update(dfn[qr[now][i].a[j]],dfn[qr[now][i].a[j]]+siz[qr[now][i].a[j]]-1,-n,1,1,n);
// printf("del %d %d\n",dfn[qr[now][i].a[j]],dfn[qr[now][i].a[j]]+siz[qr[now][i].a[j]]-1);
}
}
ans[qr[now][i].id]=tr.search(1,n,1,1,n);
if(ans[qr[now][i].id]<0){
ans[qr[now][i].id]=0;
}
// printf("ans %d %d\n",qr[now][i].id,ans[qr[now][i].id]);
for(int j=0;j<qr[now][i].k;j++){
if(dfn[qr[now][i].a[j]]<=dfn[now]&&dfn[now]<=dfn[qr[now][i].a[j]]+siz[qr[now][i].a[j]]-1){
int l=0,r=line[qr[now][i].a[j]].size()-1;
while(l<r){
int mid=(l+r)>>1;
if(dfn[line[qr[now][i].a[j]][mid]]<=dfn[now]){
l=mid+1;
}
else{
r=mid;
}
}
if(l!=line[qr[now][i].a[j]].size()-1||dfn[line[qr[now][i].a[j]][l]]>dfn[now]){
l--;
}
tr.update(1,dfn[line[qr[now][i].a[j]][l]]-1,n,1,1,n);
tr.update(dfn[line[qr[now][i].a[j]][l]]+siz[line[qr[now][i].a[j]][l]],n,n,1,1,n);
}
else{
tr.update(dfn[qr[now][i].a[j]],dfn[qr[now][i].a[j]]+siz[qr[now][i].a[j]]-1,n,1,1,n);
// printf("del %d %d\n",dfn[qr[now][i].a[j]],dfn[qr[now][i].a[j]]+siz[qr[now][i].a[j]]-1);
}
}
}
for(int i=0;i<line[now].size();i++){
if(line[now][i]!=pre){
dfs2(line[now][i],now);
}
}
if(now!=1){
tr.update(dfn[now],dfn[now]+siz[now]-1,1,1,1,n);
tr.update(1,dfn[now]-1,-1,1,1,n);
tr.update(dfn[now]+siz[now],n,-1,1,1,n);
}
}
signed main(){
// freopen("tmp.in","r",stdin);
scanf("%lld %lld",&n,&q);
for(int i=1;i<=n-1;i++){
int u,v;
scanf("%lld %lld",&u,&v);
link(u,v);
link(v,u);
}
for(int i=1;i<=q;i++){
int rt,k;
vector<int> tp;
scanf("%lld %lld",&rt,&k);
for(int j=1;j<=k;j++){
int tmp;
scanf("%lld",&tmp);
tp.push_back(tmp);
}
qr[rt].push_back((query){k,i,tp});
}
dfs(1,0,0);
tr.build(1,1,n);
dfs2(1,0);
for(int i=1;i<=q;i++){
printf("%lld\n",ans[i]);
}
return 0;
}