必威体育Betway必威体育官网
当前位置:首页 > IT技术

[ONTAK2010]Peaks加强版

时间:2019-11-02 07:12:10来源:IT技术作者:seo实验室小编阅读:84次「手机版」
 

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;
}

文章最后发布于: 2019-03-16 10:02:45

相关阅读

三国志X威力加强版 解决新武将姓名和列传乱码问题——

博主小的时候很喜欢读《三国演义》,也喜欢玩光荣的三国志系列。三国志10可以说是比较好玩的了,可以操纵一个角色在三国世界里打拼~

25个能不断撬开你脑洞的营销运营经验(加强版下)

图片来源图虫:已授站长之家使用营销运营总是没有标准化的完美解决方案。但是,生活、工作中,总会有一些知识点或者经验,让你一下茅塞顿

分享到:

栏目导航

推荐阅读

热门阅读