有无帮调或hack数据
查看原帖
有无帮调或hack数据
524091
dami826楼主2025/1/13 14:29

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;
}
2025/1/13 14:29
加载中...