[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