其他分享
首页 > 其他分享> > [ONTAK2010]Peaks加强版

[ONTAK2010]Peaks加强版

作者:互联网

题链:https://www.lydsy.com/JudgeOnline/problem.php?id=3551

 

kruskal重构树+主席树维护

#include<cstdio>
#include<algorithm>
using namespace std;

int red()
{
	int ret=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
		ch=getchar();
	while(ch>='0'&&ch<='9')
	{
		ret=(ret<<1)+(ret<<3)+ch-'0';
		ch=getchar();
	}
	return ret;
}

int write(int x)
{
	if(x/10) write(x/10);
	putchar(x%10+48);
}

const int N=2e5+5,M=5e5+5,S=6e6+5;
int n,m,a[N],fa[M],tot,lg[M];
int f[M][20],son[M][2],w[M],r;
int dfn,dy[M],in[M],out[M],rt[N];
int cnt,ls[S],rs[S],c[S],ans;

struct A{int u,v,w; }e[M];
bool cmp(A i,A j){return i.w<j.w; } 

int find(int x)
{
	return x==fa[x]?x:fa[x]=find(fa[x]);
}

void dfs(int u)
{
	if(u<=n)
	{
		++dfn;
		in[u]=out[u]=dfn;
		dy[dfn]=u;
	}
		else
	{
		dfs(son[u][0]);
		dfs(son[u][1]);
		in[u]=in[son[u][0]];
		out[u]=out[son[u][1]];
	} 
}

void build(int p1,int &p2,int l,int r,int x)
{
	p2=++cnt;
	c[p2]=c[p1]+1;
	ls[p2]=ls[p1];
	rs[p2]=rs[p1];
	if(l==r)
		return;
	int mid=l+r>>1;
	if(x<=mid)
		build(ls[p1],ls[p2],l,mid,x);
	else
		build(rs[p1],rs[p2],mid+1,r,x);
}

int get(int p1,int p2,int l,int r,int x)
{
	if(l==r)
		return l;
	int mid=l+r>>1;
	int d=c[ls[p2]]-c[ls[p1]];
	if(d>=x)
		return get(ls[p1],ls[p2],l,mid,x);
	else
		return get(rs[p1],rs[p2],mid+1,r,x-d); 		
}

int main()
{
	n=red(),m=red();
	int q=red();
	for(int i=1;i<=n;i++)
	{
		a[i]=red();
		r=max(r,a[i]);
	}
	for(int i=1;i<=m;i++)
	{
		e[i].u=red();
		e[i].v=red();
		e[i].w=red();
	}
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=n+n-1;i++)
		fa[i]=i;
	lg[0]=-1;
	for(int i=1;i<=n+n-1;i++)
		 lg[i]=lg[i>>1]+1;
	tot=n;
	for(int i=1;i<=m;i++)
	{
		int u=find(e[i].u),v=find(e[i].v);
		if(u!=v)
		{
			tot++;
			fa[u]=fa[v]=f[u][0]=f[v][0]=tot;
			w[tot]=e[i].w;
			son[tot][0]=u;
			son[tot][1]=v;
			if(tot==n+n-1) break;
		}
	}
	f[tot][0]=tot;
	for(int j=1;j<=lg[tot];j++)
		for(int i=1;i<=tot;i++)
			f[i][j]=f[f[i][j-1]][j-1];
	dfs(tot);
	for(int i=1;i<=n;i++)
	{
		rt[i]=rt[i-1];
		build(rt[i-1],rt[i],1,r,a[dy[i]]);
	}
	ans=0;
	while(q--)
	{
		int u=red(),v=red(),k=red();
		for(int i=lg[tot];i>=0;i--)
			if(w[f[u][i]]<=v)
				u=f[u][i];
		if(out[u]-in[u]+1<k)
			puts("-1");
		else
		{
			ans=get(rt[in[u]-1],rt[out[u]],1,r,out[u]-in[u]+2-k);
			write(ans);
			puts("");
		}
	}
	return 0;
}

 

标签:p2,ch,Peaks,int,ONTAK2010,p1,ls,red,加强版
来源: https://blog.csdn.net/YYHS_WSF/article/details/88592654