萌新25pts,Kruskal+主席树求调
  • 板块P4197 Peaks
  • 楼主SuperCowHorse
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/17 12:42
  • 上次更新2024/8/17 15:46:34
查看原帖
萌新25pts,Kruskal+主席树求调
541069
SuperCowHorse楼主2024/8/17 12:42
#include<bits/stdc++.h>
using namespace std;
#define lson t[p].l,l,mid
#define rson t[p].r,mid+1,r
#define lc ch[p][0]
#define rc ch[p][1]
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
const int maxn=4e5+5;
const int maxm=5e5+5;
int n,m,Q,a[maxn],h[maxn],o[maxn];
struct EDGE{
	int u,v,w;
}E[maxm];
inline bool cmp(EDGE u,EDGE v){
	return u.w<v.w;
}
struct edge{
	int v,next;
}e[maxn<<1];int head[maxn],cnt;
inline void add(int u,int v){
	e[++cnt]=(edge){v,head[u]};
	head[u]=cnt;
}
int fa[maxn],val[maxn],L[maxn],R[maxn];
int d[maxn][30];
inline void init(){
	for(int i=1;i<=n;++i){
		fa[i]=i;
	}
}
inline int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
int res,id[maxn];
inline void dfs(int u,int f){
	L[u]=1e9;
	if(u<=n){
		L[u]=R[u]=++res;
		id[res]=u;
		return;
	}
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].v;
		if(v==f) continue;
		dfs(v,u);
		d[v][0]=u;
		L[u]=min(L[u],L[v]);
		R[u]=max(R[u],R[v]);
	}
}
inline void Kruskal(){
	init();sort(E+1,E+1+m,cmp);
	int tot=n;
	for(int i=1;i<=m;++i){
		int u=E[i].u,v=E[i].v,w=E[i].w;
		int p=find(u),q=find(v);
		if(p!=q){
			++tot;
			add(tot,p);add(p,tot);
			add(tot,q);add(q,tot);
//			printf("%d %d\n%d %d\n",tot,p,tot,q);
			fa[p]=fa[q]=fa[tot]=tot;
			val[tot]=w;
		}
	}
	dfs(tot,0);
	for(int i=1;i<=n;++i){
		h[i]=a[id[i]];
	}
//	printf("%d %d ",tot,res);for(int i=1;i<=n;++i) printf("%d%c",h[i]," \n"[i==n]);
//	for(int i=1;i<=tot;++i) printf("%d %d\n",L[i],R[i]);
//	for(int i=n+1;i<=tot;++i) printf("%d%c",val[i]," \n"[i==tot]);
	for(int j=1;(1<<j)<=tot;++j){
		for(int i=1;i<=n;++i){
			d[i][j]=d[d[i][j-1]][j-1];
		}
	}
}
struct SegmentTree{
	int l,r,sum;
}t[maxn*20];int rt[maxn],Cnt;
inline void build(int &p,int l,int r){
	p=++Cnt;
	if(l==r){
		t[p].sum=0;
		return;
	}
	int mid=(l+r)>>1;
	build(lson);build(rson);
}
inline void Modify(int &q,int p,int l,int r,int x){
	q=++Cnt;t[q]=t[p];++t[q].sum;
	if(l==r) return;
	int mid=(l+r)>>1;
	if(x<=mid) Modify(t[q].l,lson,x);
	if(x>mid)  Modify(t[q].r,rson,x);
}
inline int Query(int l,int r,int lx,int rx,int k){
	int x=t[t[rx].l].sum-t[t[lx].l].sum;
	if(l==r) return o[l];
	int mid=(l+r)>>1;
	if(x>=k) return Query(l,mid,t[lx].l,t[rx].l,k);
	else return Query(mid+1,r,t[lx].r,t[rx].r,k-x);
}
inline void solve(){
	scanf("%d%d%d",&n,&m,&Q);
	for(int i=1;i<=n;++i){
		scanf("%d",&a[i]);
	}
	for(int i=1,u,v,w;i<=m;++i){
		scanf("%d%d%d",&u,&v,&w);
		E[i]=(EDGE){u,v,w};
	}
	Kruskal();
	for(int i=1;i<=n;++i){
		o[i]=h[i];
	}
	sort(o+1,o+1+n);
	int l=unique(o+1,o+1+n)-o-1;
	build(rt[0],1,l);
	for(int i=1;i<=n;++i){
		int x=lower_bound(o+1,o+1+l,h[i])-o;
		Modify(rt[i],rt[i-1],1,l,x);
	}
	val[0]=2e9;
	for(int u,x,k;Q;--Q){
		scanf("%d%d%d",&u,&x,&k);
		for(int i=25;i>=0;--i){
			if(val[d[u][i]]<=x){
				u=d[u][i];
			}
		}
		if(R[u]-L[u]+1<k){
			printf("-1\n");
			continue;
		}
//		printf("%d\n",Query(1,l,rt[L[u]-1],rt[R[u]],R[u]-L[u]+1-k+1));
		vector<int>r;
		for(int i=L[u];i<=R[u];++i){
			r.push_back(h[i]);
		}
		sort(r.begin(),r.end());
//		for(int i=0;i<r.size();++i){
//			printf("%d%c",r[i]," \n"[i==r.size()-1]);
//		}
		printf("%d\n",r[R[u]-L[u]+1-k]);
	}
}
signed main(){
	int T=1;
	for(;T;--T){
	     solve();
	}
	return 0;
}
2024/8/17 12:42
加载中...