• bzoj 3551: [ONTAK2010]Peaks加强版


    Description

    【题目描述】同3545

    Input

    第一行三个数N,M,Q。
    第二行N个数,第i个数为h_i
    接下来M行,每行3个数a b c,表示从a到b有一条困难值为c的双向路径。
    接下来Q行,每行三个数v x k,表示一组询问。v=v xor lastans,x=x xor lastans,k=k xor lastans。如果lastans=-1则不变。
     

    Output

    同3545

    Sample Input

    Sample Output

    HINT

    【数据范围】同3545

    Source

    Kruskal重构树,就是在合并的时候新建一个节点,点权为边权。。

    有一些性质:

    1.这是一棵二叉树。(没卵用)

    2.原树点都是叶子结点。

    3.子结点比父结点点权小(大根堆)。

    4.原树与新树两点间路径最大值与新树相等,且等于新树两点lcalca点权。

    所以只要从v点往上跳到深度最浅的<=x的点,然后查询子树第k大即可。。

    然而死活RE,弃了弃了。。。

    // MADE BY QT666
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<iostream>
    #include<cstring>
    #define RG register
    using namespace std;
    typedef long long ll;
    const int N=400050;
    int n,m,Q,sz,fa[N],rt[N],ls[N*20],rs[N*20],sum[N*20],hsh[N],Fa[N];
    int id[N],dfn[N],ed[N],h[N],v[N],size[N],son[N],top[N];
    struct data{
      int a,b,c;
    }e[500050];
    bool cmp(const data &a,const data &b){return a.c<b.c;}
    int head[N],to[N],nxt[N],cnt,tt,tot,res;
    inline void lnk(int x,int y){
      to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
    }
    inline int find(int x){
      if(x!=fa[x]) fa[x]=find(fa[x]);
      return fa[x];
    }
    inline void dfs1(int x,int f){
      size[x]=1;
      for(RG int i=head[x];i;i=nxt[i]){
        int y=to[i];
        if(y!=f){
          Fa[y]=x;dfs1(y,x);size[x]+=size[y];
          if(size[y]>size[son[x]]) son[x]=y;
        }
      }
    }
    inline void dfs2(int x,int ff){
      dfn[x]=++tot;id[tot]=x;top[x]=ff;
      if(son[x]) dfs2(son[x],ff);
      for(RG int i=head[x];i;i=nxt[i]){
        int y=to[i];
        if(y!=Fa[x]&&y!=son[x]) dfs2(y,y);
      }
      ed[x]=tot;
    }
    inline void insert(RG int x,RG int &y,RG int l,RG int r,RG int u){
      y=++sz;ls[y]=ls[x],rs[y]=rs[x];sum[y]=sum[x]+1;
      if(l==r) return;
      RG int mid=(l+r)>>1;
      if(u<=mid) insert(ls[x],ls[y],l,mid,u);
      else insert(rs[x],rs[y],mid+1,r,u);
    }
    inline int query(RG int x,RG int y,RG int l,RG int r,RG int k){
      if(l==r) return l;
      RG int mid=(l+r)>>1;
      if(sum[ls[y]]-sum[ls[x]]>=k) return query(ls[x],ls[y],l,mid,k);
      else return query(rs[x],rs[y],mid+1,r,k-(sum[ls[y]]-sum[ls[x]]));
    }
    inline int jump(RG int x,RG int lim){
      RG int j=x;
      while(x&&v[top[x]]<=lim){
        j=top[x],x=Fa[top[x]];
      }
      if(v[x]>lim||v[top[x]]<=lim) return j; 
      RG int l=dfn[top[x]],r=dfn[x],ret=0;
      while(l<=r){
        RG int mid=(l+r)>>1;
        if(v[id[mid]]<=lim) r=mid-1,ret=mid;
        else l=mid+1;
      }
      return id[ret];
    }
    int main(){
      freopen("Peaks.in","r",stdin);
      freopen("Peaks.out","w",stdout);
      scanf("%d%d%d",&n,&m,&Q);
      for(RG int i=1;i<=n;i++) scanf("%d",&h[i]),hsh[++res]=h[i];
      for(RG int i=1;i<=m;i++) scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].c);
      sort(e+1,e+1+m,cmp);for(int i=1;i<=n;i++) fa[i]=i;tt=n;
      for(RG int i=1;i<=m;i++){
        RG int x=find(e[i].a),y=find(e[i].b);
        if(y!=x){
          tt++;v[tt]=e[i].c;fa[x]=fa[y]=tt;fa[tt]=tt;
          lnk(tt,x);lnk(tt,y);
        }
      }
      for(RG int i=1;i<=tt;i++){
        RG int g=find(i);
        if(!dfn[g]) dfs1(g,g),dfs2(g,g);
      }
      sort(hsh+1,hsh+res+1);res=unique(hsh+1,hsh+1+res)-hsh-1;
      for(RG int i=1;i<=tot;i++){
        rt[i]=rt[i-1];
        if(id[i]<=n) insert(rt[i],rt[i],1,res,lower_bound(hsh+1,hsh+1+res,h[id[i]])-hsh);
      }
      RG int lastans=0;
      while(Q--){
        RG int u,x,k;scanf("%d%d%d",&u,&x,&k);
        u^=lastans,x^=lastans,k^=lastans;
        RG int Lca=jump(u,x);
        if(sum[rt[ed[Lca]]]-sum[rt[dfn[Lca]-1]]<k) puts("-1"),lastans=0;
        else lastans=query(rt[dfn[Lca]-1],rt[ed[Lca]],1,res,(sum[rt[ed[Lca]]]-sum[rt[dfn[Lca]-1]])-k+1),printf("%d
    ",hsh[lastans]);
      }
      return 0;
    }
    

      

  • 相关阅读:
    re.sub函数的深入了解
    xpath
    改变评分查询
    Boolean Query
    固定分数查询
    Unicode编码的原型
    java中基本类型占用字节数
    Java Socket网络编程的经典例子(转)
    (转)工厂模式
    (转)java垃圾回收机制
  • 原文地址:https://www.cnblogs.com/qt666/p/7287422.html
Copyright © 2020-2023  润新知