25求调
  • 板块P4197 Peaks
  • 楼主cai_cai_cai
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/11 22:26
  • 上次更新2024/9/12 15:53:22
查看原帖
25求调
1275495
cai_cai_cai楼主2024/9/11 22:26
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,q,l[200005],r[200005],fsf[30][200005],dep[200005];
int num[200005],f[200005],h[200005],minn[200005],maxx[200005],_id[200005],cnt=0;
inline void init(int u,int fa){
	fsf[0][u]=fa;
	dep[u]=dep[fa]+1;
	for(register int i=1;i<=25;++i){
		fsf[i][u]=fsf[i-1][fsf[i-1][u]];
	}
	minn[u]=LONG_LONG_MAX;
	if(l[u]==0)minn[u]=++cnt,maxx[u]=cnt,_id[cnt]=u;
	if(l[u]==0)return;
	for(register int mmm=l[u],i=1;i<=2;mmm=r[u],++i){
		int v=mmm;
		if(v==fa)continue;
		init(v,u);
		minn[u]=min(minn[u],minn[v]);
		maxx[u]=max(maxx[u],maxx[v]);
	}
}
inline int LCA(int u,int k){
	int i=0;
	while(k){
		if(k&1)u=fsf[i][u];
		k>>=1,++i;
	}
	return u;
}
struct node{int u,v,w;bool operator<(const node&x)const{return w<x.w;}}e[500005];
int fun(const int&x){if(f[x]==x)return x;return f[x]=fun(f[x]);}
inline void kruskal(){
	stable_sort(e+1,e+m+1);
	for(register int i=1;i<=m;++i){
		int fu=fun(e[i].u),fv=fun(e[i].v);
		if(fu!=fv){
			l[++n]=fu;
			r[n]=fv;
			num[n]=e[i].w;
			f[fv]=n;
			f[fu]=n;
			f[n]=n;
		}
	}
}
namespace seq{
	int tot=0,n=0;
	int sum[200005<<5]={},rt[200005]={},ls[200005<<5]={},rs[200005<<5]={};
	int a[200005]={},ind[200005]={},len=0;
	inline int getid(const int&val){
		return lower_bound(ind+1,ind+len+1,val)-ind;
	}
	inline int build(int l,int r){
		int root=++tot;
		if(l==r)return root;
		int mid=(l+r)>>1;
		ls[root]=build(l,mid);
		rs[root]=build(mid+1,r);
		return root;
	}
	inline int update(int k,int l,int r,int root){
		int dir=++tot;
		ls[dir]=ls[root],rs[dir]=rs[root],sum[dir]=sum[root]+1;
		if(l==r)return dir;
		int mid=(l+r)>>1;
		if(k<=mid)
			ls[dir]=update(k,l,mid,ls[dir]);
		else
			rs[dir]=update(k,mid+1,r,rs[dir]);
		return dir;
	}
	inline int query(int u,int v,int l,int r,int k){
		int mid=(l+r)>>1,
		x=sum[ls[v]]-sum[ls[u]];
		if(l==r)return l;
		if(k<=x)
			return query(ls[u],ls[v],l,mid,k);
		else
			return query(rs[u],rs[v],mid+1,r,k-x);
	}
	inline void init(){
		n=(::n*2-1);
		for(register int i=1;i<=n;++i){
			a[i]=::h[_id[i]];
		}
		memcpy(ind,a,sizeof ind);
		stable_sort(ind+1,ind+n+1);
		len=n;
		rt[0]=build(1,len);
		for(register int i=1;i<=n;++i)rt[i]=update(getid(a[i]),1,len,rt[i-1]);
	}
	inline int work(int l,int r,int k){
		if(k<0){
			return -1;
		}
		return ind[query(rt[l-1],rt[r],1,len,k)];
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	iota(f+1,f+200002,1);
	cin>>n>>m>>q;
	for(register int i=1;i<=n;++i){
		cin>>h[i];
	}
	for(register int j=1;j<=m;j++){
		cin>>e[j].u>>e[j].v>>e[j].w;
	}
	kruskal();
	::init(n,n);
	seq::init();
	int maxxx=0;
	for(int i=1;i<=n;i++){
		maxxx=max(maxxx,dep[i]);
	}
	while(q--){
		int v,x,k;
		cin>>v>>x>>k;
		int L=0,R=maxxx,ans;
		while(L<=R){
			int mid=(L+R)>>1;
			if(num[LCA(v,mid)]<=x){
				ans=mid;
				L=mid+1;
			}else{
				R=mid-1;
			}
		}
		L=LCA(v,ans);
		R=maxx[L];L=minn[L];
		ans=seq::work(L,R,R-L+2-k);
		cout<<ans<<"\n";
	}
	return 0;
}
2024/9/11 22:26
加载中...