萌新求条 50pts
  • 板块P4197 Peaks
  • 楼主TLE_AK
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/12 20:31
  • 上次更新2024/7/12 21:55:04
查看原帖
萌新求条 50pts
788951
TLE_AK楼主2024/7/12 20:31
#include<bits/stdc++.h>
using namespace std;


namespace acac
{
	int tree[6400010],rt[200010],bcj[200010],son[6400010][2];
	int n,m,q,cnt=1;
	
	void build(int u,int l,int r)
	{
		if(l==r)return ;
		int mid=(l+r)>>1;
		son[u][0]=++cnt;
		build(cnt,l,mid);
		son[u][1]=++cnt;
		build(cnt,mid+1,r);
		
	}
	
	void pu(int u)
	{
		tree[u]=tree[son[u][0]]+tree[son[u][1]];
	}
	
	void c(int u,int l,int r,int w)
	{
		if(l==r)
		{
			tree[cnt]=tree[u]+1;
			return ;
		}
		int mid=(l+r)>>1,ycnt=cnt;
		if(w<=mid)
		{
			son[cnt][1]=son[u][1];
			son[cnt][0]=cnt+1;
			++cnt;
			c(son[u][0],l,mid,w);
		}
		else
		{
			son[cnt][0]=son[u][0];
			son[cnt][1]=cnt+1;
			++cnt;
			c(son[u][1],mid+1,r,w);
		}
		pu(ycnt);
	}
	
	
	int qr(int u,int u2,int l,int r,int k)
	{
		if(l==r)return l;
		int mid=(l+r)>>1;
		if(tree[son[u][0]]-tree[son[u2][0]]>=k)return qr(son[u][0],son[u2][0],l,mid,k);
		return qr(son[u][1],son[u2][1],mid+1,r,k-(tree[son[u][0]]-tree[son[u2][0]]));
	}
	
	int belong(int u)
	{
		if(bcj[u]!=u)return bcj[u]=belong(bcj[u]);
		return u;
	}
	
	struct edge
	{
		int fr,to,v;
	}e[500010];
	
	bool cmp(edge a,edge b)
	{
		return a.v<b.v;
	}
	
	int nt[300010][4];
	int ds;
	
	void mst()
	{
		sort(e+1,e+1+m,cmp);
		ds=n;
		int num=0;	
		for(int i=1;i<=m;i++)
		{
			if(num==n-1)break;
			int a=belong(e[i].fr),b=belong(e[i].to);
			if(a==b)continue;
			num++,ds++;
			nt[ds][0]=a,nt[ds][1]=b,nt[ds][2]=e[i].v;
			bcj[a]=bcj[b]=ds;
		}
		
	}
	
	
	int F[300010][25],st[300010][25],xl[300010],kz[300010][3],T[300010];
	int dfn=0;
	void dfs(int u,int fa,int v)
	{
		T[u]=1;
		F[u][0]=fa;
		st[u][0]=v;
		//cout<<u<<' '<<fa<<' '<<v<<endl;
		for(int i=1;i<=20;i++)
		{
			F[u][i]=F[F[u][i-1]][i-1];
			st[u][i]=max(st[u][i-1],st[F[u][i-1]][i-1]); 
		}
		if(!nt[u][0]&&!nt[u][1])
		{
			xl[++dfn]=u;
			kz[u][1]=kz[u][0]=dfn;
			return ;
		}
		dfs(nt[u][0],u,nt[u][2]);
		if(!nt[u][0])while(1);
		kz[u][0]=kz[nt[u][0]][0];
		dfs(nt[u][1],u,nt[u][2]);
		if(!nt[u][1])while(1);
		kz[u][1]=kz[nt[u][1]][1];
	}
	
	int ls[100010];
	int A[100010];
	
	int main()
	{
		scanf("%d%d%d",&n,&m,&q);
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&A[i]);
			bcj[i]=i;
			bcj[i+n]=i+n;
		}
		sort(A+1,A+1+n);
		int tot=0;
		A[0]=-1;
		for(int i=1;i<=n;i++)
		{
			if(A[i]!=A[i-1])ls[++tot]=A[i];
			A[i]=tot;
		}
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d%d",&e[i].fr,&e[i].to,&e[i].v); 
		}
		mst();
		for(int i=1;i<=n;i++)
		{
			int a=belong(i);
			//cout<<a<<endl;
			if(!T[a])dfs(a,0,0);
		}
		rt[0]=1;
		build(1,1,tot);
		for(int i=1;i<=n;i++)
		{
			int val=A[xl[i]];
		//	cout<<val<<' ';
			rt[i]=++cnt;
			c(rt[i-1],1,tot,val);
		}
		//cout<<endl;
		while(q--)
		{
			int u,x,k;
			scanf("%d%d%d",&u,&x,&k);
			
			for(int i=20;i>=0;i--)
			{
		//		cout<<u<<' '<<i<<' '<<st[u][i]<<endl;
				if(st[u][i]<=x&&F[u][i])u=F[u][i];
			}
		//	cout<<u<<endl;
		//	cout<<kz[u][1]-kz[u][0]+2-k<<endl; 
			if(kz[u][1]-kz[u][0]+1<k)cout<<"-1\n";
			else 
			{
				int ans=qr(rt[kz[u][1]],rt[kz[u][0]-1],1,tot,kz[u][1]-kz[u][0]+2-k);
			//	cout<<ans<<endl;
				cout<<ls[ans]<<'\n';	
			}
		}
		
		return 0;
	}
}

int main()
{
	acac::main();
	return 0;
}
2024/7/12 20:31
加载中...