求调,不过样例
查看原帖
求调,不过样例
359845
岂非楼主2024/1/16 22:00

exit with code233

233那一行是想判一下父子节点siz是否相同的,然后炸了。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdlib>
using namespace std;
int n,n1,m,q,a[200010],u,v,w,ans,f[200010],dep[200010],fa[20][200010],tot,P[200010];
struct edge{
	int u,v,w;
}e[500010];
bool cmp(edge x,edge y){
	return x.w<y.w;
}
vector <int> ve1[200010];
int ff0(int x){
	if(f[x]==x) return x;
	return f[x]=ff0(f[x]);
}
struct Node{
	int l,r,mid,ls,rs;
	int siz;
}N[30000010];
int nwd(int l,int r){
	int p=++tot;
	N[p].l=l;N[p].r=r;N[p].mid=(l+r)>>1;
	N[p].ls=N[p].rs=N[p].siz=0;
	return p;
}
void pup(int p){
	N[p].siz=N[N[p].ls].siz+N[N[p].rs].siz;
}
void add(int pos,int p){
	if(N[p].l==N[p].r){
		N[p].siz++;
		return;
	}
	if(pos<=N[p].mid){
		if(!N[p].ls) N[p].ls=nwd(N[p].l,N[p].mid);
		add(pos,N[p].ls);
	}
	else{
		if(!N[p].rs) N[p].rs=nwd(N[p].mid+1,N[p].r);
		add(pos,N[p].rs);
	}
	pup(p);
}
void merg(int p1,int p2){
	if(N[p1].l==N[p1].r){
		N[p1].siz+=N[p2].siz;
		return;
	}
	if(!N[p1].ls) N[p1].ls=N[p2].ls;
	else{
		if(N[p2].ls) merg(N[p1].ls,N[p2].ls);
	}
	if(!N[p1].rs) N[p1].rs=N[p2].rs;
	else{
		if(N[p2].rs) merg(N[p1].rs,N[p2].rs);
	}
	pup(p1);
}
void dfs(int x){
	for(int i=1;i<20;i++){
		fa[i][x]=fa[i-1][fa[i-1][x]];
	}
	P[x]=nwd(1,1000000000);
	if(x<=n1){
		add(a[x],P[x]);
	}
	for(auto i:ve1[x]){
		fa[0][i]=x;dep[i]=dep[x]+1;
		dfs(i);
		merg(P[x],P[i]);
	}
}
int query(int k,int p){
	if(N[p].l==N[p].r) return N[p].l;
	if(N[p].siz!=N[N[p].ls].siz+N[N[p].rs].siz){
		cout<<N[p].ls<<' '<<N[p].rs<<' '<<N[0].siz;
		exit(233);
	}
	if(N[p].rs){
		if(k<=N[N[p].rs].siz) return query(k,N[p].rs);
		else k-=N[N[p].rs].siz;
	}
	return query(k,N[p].ls);
}
int main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	cin>>n>>m>>q;n1=n;
	for(int i=1;i<=n;i++){
		cin>>a[i];f[i]=i;f[n+i]=n+i;
	}
	for(int i=1;i<=m;i++){
		cin>>e[i].u>>e[i].v>>e[i].w;
	}
	sort(e+1,e+1+m,cmp);
	for(int i=1;i<=m;i++){
		u=ff0(e[i].u);v=ff0(e[i].v);
		if(u==v) continue;
		n++;
		ve1[n].push_back(u);
		ve1[n].push_back(v);
		f[u]=n;f[v]=n;a[n]=e[i].w;
	}
	for(int i=n1+1;i<=n;i++){
		if(f[i]==i) dfs(i);
	}
	for(int i=1;i<=q;i++){
		cin>>u>>v>>w;
		u=(u^ans)%n1+1;
		w=(w^ans)%n1+1;
		v=v^ans;
		for(int j=19;~j;j--){
			if(fa[j][u]&&a[fa[j][u]]<=v) u=fa[j][u];
		}
//		cout<<ve1[u][0]<<' '<<ve1[u][1]<<'\n';
		if(N[P[u]].siz<w){
			ans=-1;
		}
		else{
			ans=query(w,P[u]);
		}
		cout<<ans<<'\n';
	}
	return 0;
}
2024/1/16 22:00
加载中...