评测结果不一致
  • 板块P4116 Qtree3
  • 楼主ACRUSHj
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/6 08:40
  • 上次更新2023/11/3 11:24:11
查看原帖
评测结果不一致
925506
ACRUSHj楼主2023/7/6 08:40

link

如果是的话,我在vjudge上通过了,但洛谷上却过不了?

代码如下,好心人帮忙看看吧/kel

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node{
	int l,r,sum;
}t[N<<2];
int n,m,top[N],dfn[N],nfd[N],sz[N],h[N],f[N];
vector<int>e[N];
void DFS(int u,int fa){
	f[u]=fa;sz[u]=1;
	for(int v:e[u]){
		if(v!=fa){
			DFS(v,u);
			sz[u]+=sz[v];
			if(sz[v]>sz[h[u]])h[u]=v;
		}
	}
}
void dfs(int u,int fa,int T){
	dfn[u]=++dfn[0];
	top[u]=T;
	if(h[u])dfs(h[u],u,T);
	for(int v:e[u]){
		if(v!=fa&&v!=h[u]){  
			dfs(v,u,v);
		}
	}
}
void build(int u,int l,int r){
	t[u].l=l;t[u].r=r;
	if(l==r){
		t[u].sum=0;
		return;
	}
	int mid=(l+r)>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
}
void modify(int u,int aim){
	if(t[u].l==aim&&t[u].r==aim){
		t[u].sum=1-t[u].sum;
		return;
	}
	int mid=(t[u].l+t[u].r)>>1;
	if(mid>=aim)modify(u<<1,aim);
	else modify(u<<1|1,aim);
	t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
}
int Qry(int u,int l,int r){
	if(t[u].l>r||t[u].r<l)return 0;
	if(t[u].l>=l&&t[u].r<=r)return t[u].sum;
	int mid=t[u].l+t[u].r>>1,ret=0;
	if(mid>=l)ret+=Qry(u<<1,l,r);
	if(mid+1<=r)ret+=Qry(u<<1|1,l,r);
	return ret;
}
int Search(int u,int l,int r){
    if(t[u].l==t[u].r)return t[u].l;
    int mid=t[u].l+t[u].r>>1;
    if(mid>=l&&t[u<<1].sum)return Search(u<<1,l,r);
    else return Search(u<<1|1,l,r);
}
int query(int k){
    vector<pair<int,int>>q;
	while(top[k]!=1){
        q.push_back(make_pair(dfn[top[k]],dfn[k]));
        k=f[top[k]];
	}
    q.push_back(make_pair(dfn[1],dfn[k]));
    for(int i=(int)q.size()-1;i>=0;i--){
        int L=q[i].first,R=q[i].second;
        int now=Qry(1,L,R);
        if(now)return nfd[Search(1,L,R)];
    }
    return -1;
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1,x,y;i<n;i++){
		scanf("%d%d",&x,&y);
		e[x].push_back(y);e[y].push_back(x);
	}
	DFS(1,0);dfs(1,0,1);build(1,1,n);
    for(int i=1;i<=n;i++)nfd[dfn[i]]=i;
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		if(x==1){
			printf("%d\n",query(y));
		}else{
			modify(1,dfn[y]);
		}
	}
//    system("pause");
	return 0;
}
2023/7/6 08:40
加载中...