zoukankan      html  css  js  c++  java
  • Hiho 1232 北京网络赛 F Couple Trees

    给两颗标号从1...n的树,保证标号小的点一定在上面。每次询问A树上的x点,和B树上的y点同时向上走,最近的相遇点和x,y到这个点的距离。

    比赛的时候想用倍增LCA做,但写渣了。。。。后来看到题解是主席树就写了一发

    呆马:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <algorithm>
      4 #include <cstring>
      5 #include <cmath>
      6 #include <vector>
      7 #define inf 1000000007
      8 #define maxn 100020
      9 #define maxm 4200
     10 
     11 using namespace std;
     12 
     13 int fa[maxn],ga[maxn],ll[maxn],rr[maxn],dep[maxn],gap[maxn];
     14 int n,m,cnt;
     15 
     16 struct node
     17 {
     18     node *lc, *rc;
     19     int key, cov;
     20     node(){
     21         key=0;
     22         cov=0;
     23         lc=rc=NULL;
     24     }
     25 };
     26 
     27 struct ChairManTree
     28 {
     29     node *tree,*rot[maxn];
     30     int tot;
     31     node *new_node(){ return &tree[++tot];}
     32     node *build(int l, int r)
     33     {
     34         node *now=new_node();
     35         now->cov=now->key=0;
     36         if (l==r) return now;
     37         int mid=(l+r)>>1;
     38         now->lc=build(l,mid);
     39         now->rc=build(mid+1,r);
     40         return now;
     41     }
     42 
     43     void down(node *p)
     44     {
     45         if (p->cov)
     46         {
     47             node *nl=new_node();
     48             node *nr=new_node();
     49             *nl=*p->lc;
     50             *nr=*p->rc;
     51             nl->key=max(p->lc->key,p->cov);
     52             nl->cov=max(p->lc->cov,p->cov);
     53             nr->key=max(p->rc->key,p->cov);
     54             nr->cov=max(p->rc->cov,p->cov);
     55             p->lc=nl;
     56             p->rc=nr;
     57             p->cov=0;
     58         }
     59     }
     60 
     61     node *change(node *p, int l, int r, int ll, int rr, int x)
     62     {
     63         node *now=new_node();
     64         if (ll<=l && r<=rr)
     65         {
     66             *now=*p;
     67             now->key=max(now->key,x);
     68             now->cov=max(now->cov,x);
     69             return now;
     70         }
     71         down(p);
     72         *now=*p;
     73         int mid=(l+r)>>1;
     74         if (ll<=mid) now->lc=change(p->lc, l, mid, ll, rr, x);
     75         if (rr>mid) now->rc=change(p->rc, mid+1, r, ll, rr, x);
     76         return now;
     77     }
     78 
     79     int query(node *now, int l, int r, int x)
     80     {
     81         if (l==r) return now->key;
     82         down(now);
     83         int mid=(l+r)>>1;
     84         if (x<=mid) return query(now->lc, l, mid, x);
     85         else return query(now->rc, mid+1, r, x);
     86     }
     87 
     88     void write(node *now,int l,int r)
     89     {
     90         if (l==r)
     91         {
     92             cout<<now->key;
     93             return ;
     94         }
     95         down(now);
     96         int mid=(l+r)>>1;
     97         write(now->lc,l,mid);
     98         write(now->rc,mid+1,r);
     99     }
    100 
    101     void init(int n)
    102     {
    103         tree=new node[n*80];
    104         tot=0;
    105     }
    106     void clear()
    107     {
    108         delete [] tree;
    109     }
    110 }s;
    111 
    112 vector<int> e[maxn];
    113 
    114 void dfs(int x)
    115 {
    116     ll[x]=++cnt;
    117     int n=e[x].size();
    118     for (int i=0;i<n;i++)
    119     {
    120         int k=e[x][i];
    121         dfs(k);
    122     }
    123     rr[x]=cnt;
    124 }
    125 
    126 int main()
    127 {
    128     //freopen("F.in","r",stdin);
    129     while (scanf("%d%d",&n,&m)!=EOF)
    130     {
    131         s.init(n);
    132         fa[1]=ga[1]=0;
    133         dep[1]=gap[1]=1;
    134         for (int i=1;i<=n;i++) e[i].clear();
    135         for (int i=2;i<=n;i++) scanf("%d",&fa[i]), e[fa[i]].push_back(i), dep[i]=dep[fa[i]]+1;
    136         for (int i=2;i<=n;i++) scanf("%d",&ga[i]), gap[i]=gap[ga[i]]+1;
    137         cnt=0;
    138         dfs(1);
    139         
    140         s.rot[0]=s.build(1,n);
    141         
    142         for (int i=1;i<=n;i++)
    143             s.rot[i]=s.change(s.rot[ga[i]],1,n,ll[i],rr[i],i);
    144         int x,y,ans=0;
    145         for (int i=1;i<=m;i++)
    146         {
    147             scanf("%d%d",&x,&y);
    148             x=(x+ans)%n+1, y=(y+ans)%n+1;
    149             ans=s.query(s.rot[y],1,n,ll[x]);
    150             printf("%d %d %d
    ",ans,dep[x]-dep[ans]+1, gap[y]-gap[ans]+1);
    151         }
    152         s.clear();
    153     }
    154     return 0;
    155 }
    couple tree
  • 相关阅读:
    实现单台测试机6万websocket长连接
    关于ArcGIS10.0中的栅格计算中的函数
    .NET破解之迅捷PDF转换器(续)
    ArcEngine 0x8004023C
    VS2010中重命名项目
    地理数据库本身不能加密
    ArcEngine尝试读取或写入受保护的内存
    利用路由器连接别人家的网络
    ArcGIS的许可文件问题
    MapGIS转Shp文件的单位问题
  • 原文地址:https://www.cnblogs.com/zig-zag/p/4852590.html
Copyright © 2011-2022 走看看