• [BZOJ3551]Peaks


    [BZOJ3551]Peaks

    BZOJ
    luogu
    建Kruskal重构树,点权为边权
    按dfn序建出主席树
    倍增找到能跳到的最浅的祖先
    主席树查询一下

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+5,M=5e5+5;
    int re(){
        int x=0,w=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*w;
    }
    int n,m,q,cnt,S,tot,ts,len,ans;
    int he[N],o[N],h[N<<1],val[N<<1],dfn[N<<1],sz[N<<1],dep[N<<1],fa[N<<1];
    int f[20][N<<1],rt[N<<1],s[N<<5],ls[N<<5],rs[N<<5];
    struct Edge{int u,v,w;}E[M];
    struct edge{int to,next;}e[M<<2];
    bool cmp(Edge a,Edge b){return a.w<b.w;}
    int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
    void link(int u,int v){
    	e[++cnt]=(edge){v,h[u]};h[u]=cnt;
    	e[++cnt]=(edge){u,h[v]};h[v]=cnt;
    }
    void add(int&x,int l,int r,int v){
    	s[++S]=s[x]+1;ls[S]=ls[x];rs[S]=rs[x];
    	x=S;if(l==r)return;int mid=(l+r)>>1;
    	if(v<=mid)add(ls[x],l,mid,v);
    	else add(rs[x],mid+1,r,v);
    }
    int qkth(int x,int y,int l,int r,int k){
        if(l==r)return l;
    	int mid=(l+r)>>1,Sz=s[rs[y]]-s[rs[x]];
        if(k<=Sz)return qkth(rs[x],rs[y],mid+1,r,k);
        return qkth(ls[x],ls[y],l,mid,k-Sz);
    }
    void dfs(int u){
    	dfn[u]=++ts;sz[u]=1;
    	if(f[0][u])rt[ts]=rt[ts-1];
    	if(u<=n)add(rt[ts],1,len,he[u]);
    	for(int i=h[u];i;i=e[i].next){
    		int v=e[i].to;
    		if(v==f[0][u])continue;
    		f[0][v]=u;dep[v]=dep[u]+1;
    		dfs(v);sz[u]+=sz[v];
    	}
    }
    int main(){
        tot=n=re(),m=re(),q=re();
    	for(int i=1;i<=n;i++)o[i]=he[i]=re();
    	sort(o+1,o+n+1);
    	len=unique(o+1,o+n+1)-o-1;
    	for(int i=1;i<=n;i++)
    		he[i]=lower_bound(o+1,o+len+1,he[i])-o;
    	for(int i=1;i<=n<<1;i++)fa[i]=i;
    	for(int i=1;i<=m;i++)
    		E[i].u=re(),E[i].v=re(),E[i].w=re();
    	sort(E+1,E+m+1,cmp);
    	for(int i=1;i<=m;i++){
    		int x=find(E[i].u),y=find(E[i].v);
    		if(x==y)continue;val[++tot]=E[i].w;
    		link(tot,x);link(tot,y);fa[x]=fa[y]=tot;
    	}
    	for(int i=1;i<=tot;i++)
    		if(!dfn[i])dfs(find(i));
    	for(int i=1;i<=18;i++)
    		for(int j=1;j<=tot;j++)
    			f[i][j]=f[i-1][f[i-1][j]];
    	while(q--){
    		int u=re()^ans,x=re()^ans,k=re()^ans;
    		for(int i=18;i>=0;i--)
    			if(f[i][u]&&val[f[i][u]]<=x)u=f[i][u];
    		int A=rt[dfn[u]-1],B=rt[dfn[u]+sz[u]-1];
    		if(s[B]-s[A]<k)puts("-1"),ans=0;
    		else printf("%d
    ",ans=o[qkth(A,B,1,len,k)]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    WPF程序内存泄漏问题文章推荐
    UAC影响读写文件和注册表
    .NET COM Interop 中的ReleaseComObject使用准则
    读Excel数据并导入到数据库中最快的方法
    DEP问题文章推荐
    深入了解GC文章推荐
    IIS 发布网站
    iis5.1安装方法(适用于XP),IIS5.0安装包下载、IIS5.1安装包下载、IIS6.0安装包下载
    单击GridView的某一行 根据此行id得到这行的所有信息
    asp.net背景图片自动适应屏幕大小
  • 原文地址:https://www.cnblogs.com/sdzwyq/p/10030606.html
Copyright © 2020-2023  润新知