调不明白了
查看原帖
调不明白了
800499
suzhikz楼主2025/1/10 16:34

玄关,结尾有数据

#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const int N=4e4+5; 
int n,p,q;vector<int>g[N];
int lisan[N],lisantot;
int dfn[N],siz[N],tim,fa[N][20],deep[N];
void dfs(int x){
	deep[x]=deep[fa[x][0]]+1;siz[x]=1;dfn[x]=++tim;
	for(int i=1;i<=log2(deep[x]);i++)fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i:g[x]){
		if(i==fa[x][0])continue;fa[i][0]=x;dfs(i);siz[x]+=siz[i];
	}
}
struct abc{
	int x,y1,y2,w,k,id;
}z[N*2];int ans[N],len;
bool cmp(abc a,abc b){
	if(a.x==b.x)return a.k>b.k;return a.x<b.x;
}

//树套树部分
int rt[N*20*40],ls[N*20*40],rs[N*20*40],tree[N*20*40],tot,root;
void update(int x,int l,int r,int ql,int qr,int w){
	if(ql<=l&&qr>=r){
		tree[x]+=w;return;
	}
	int mid=(l+r)/2;
	if(ql<=mid){
		if(!ls[x])ls[x]=++tot;update(ls[x],l,mid,ql,qr,w);
	}
	if(qr>mid){
		if(!rs[x])rs[x]=++tot;update(rs[x],mid+1,r,ql,qr,w);
	}
}
int query(int x,int l,int r,int p){
	if(!x)return 0;if(l==r)return tree[x];
	int mid=(l+r)/2,re=tree[x];
	if(p<=mid){
		if(ls[x])re+=query(ls[x],l,mid,p);
	}
	if(p>mid){
		if(rs[x])re+=query(rs[x],mid+1,r,p);
	}
	return re;
}
void upd(int x,int l,int r,int p,int ql,int qr,int w){
	if(rt[x]==0)rt[x]=++tot;
	update(rt[x],1,n,ql,qr,w);
	if(l==r)return;
	int mid=(l+r)/2;
	if(p<=mid){
		if(!ls[x]){
			ls[x]=++tot;
		}
		upd(ls[x],l,mid,p,ql,qr,w);
	}else{
		if(!rs[x])rs[x]=++tot;upd(rs[x],mid+1,r,p,ql,qr,w);
	}
}
int kth(int x,int l,int r,int p,int k){
	if(!x||l==r)return l;
	int mid=(l+r)/2,tmp=query(rt[ls[x]],1,n,p);
	if(tmp<k)return kth(rs[x],mid+1,r,p,k-tmp);
	else return kth(ls[x],l,mid,p,k);
}
int main(){
	read(n);read(p);read(q);
	for(int u,v,i=1;i<n;i++){
		read(u);read(v);g[u].push_back(v);g[v].push_back(u);
	}
	dfs(1);
	for(int u,v,w,i=1;i<=p;i++){
		read(u);read(v);read(w);
		lisan[++lisantot]=w;if(dfn[u]>dfn[v])swap(u,v);
		if(dfn[v]<dfn[u]+siz[u]){
			int tmp=v;
			for(int i=log2(deep[tmp]);i>=0;i--){
				if(deep[fa[tmp][i]]>deep[u])tmp=fa[tmp][i];
			}
			if(dfn[tmp]>1){
				z[++len]=(abc){1,dfn[v],dfn[v]+siz[v]-1,w,1,0};
				z[++len]=(abc){dfn[tmp]-1,dfn[v],dfn[v]+siz[v]-1,w,-1,0};
			}
			if(dfn[tmp]+siz[tmp]<=n){
				z[++len]=(abc){dfn[v],dfn[tmp]+siz[tmp],n,w,1,0};
				z[++len]=(abc){dfn[v]+siz[v]-1,dfn[tmp]+siz[tmp],n,w,-1,0};
			}
		}else{
			z[++len]=(abc){dfn[u],dfn[v],dfn[v]+siz[v]-1,w,1,0};
			z[++len]=(abc){dfn[u]+siz[u]-1,dfn[v],dfn[v]+siz[v]-1,w,-1,0};
		}
	}
	for(int i=1;i<=len;i++){
//		cout<<z[i].x<<' '<<z[i].y1<<' '<<z[i].y1<<' '<<z[i].w<<' '<<z[i].k<<' '<<z[i].id<<endl;
	}
	sort(lisan+1,lisan+1+lisantot);lisantot=unique(lisan+1,lisan+1+lisantot)-lisan-1;
	for(int i=1;i<=q;i++){
		len++;z[len].id=i;read(z[len].x);read(z[len].y1);read(z[len].w);z[len].x=dfn[z[len].x];
		z[len].y1=dfn[z[len].y1];if(z[len].x>z[len].y1)swap(z[len].x,z[len].y1);
	}
	sort(z+1,z+1+len,cmp);
	root=++tot;
	for(int i=1;i<=len;i++){
		cout<<z[i].x<<' '<<z[i].y1<<' '<<z[i].y1<<' '<<z[i].w<<' '<<z[i].k<<' '<<z[i].id<<endl;
		if(!z[i].k){
			ans[z[i].id]=lisan[kth(root,1,lisantot,z[i].y1,z[i].w)];
		}else{
			upd(root,1,lisantot,lower_bound(lisan+1,lisan+1+lisantot,z[i].w)-lisan,z[i].y1,z[i].y2,z[i].k);
		}
	}
	for(int i=1;i<=q;i++)cout<<ans[i]<<endl;
	return 0;
}
/*
3 3 3
1 2
1 3
1 2 1
1 2 2
1 3 4
1 2 1
1 3 2
2 3 1
4
4
4
*/
2025/1/10 16:34
加载中...