[ONTAK2010]Peaks加强版

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

 

kruskal重构树+主席树维护

#include
#include
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>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

 

你可能感兴趣的:(kruskal重构树,主席树)