zoukankan      html  css  js  c++  java
  • Link-Cut-Tree题目泛做(为了对应自己的课件)

    题目1:BZOJ 2049 洞穴勘测

      1 #include <bits/stdc++.h>
      2 #define L(x) c[x][0]
      3 #define R(x) c[x][1]
      4  
      5 using namespace std;
      6  
      7 const int oo = 0x3f3f3f3f;
      8  
      9 struct SplayTree{
     10   static const int N = 10000 + 5;
     11  
     12   int top, st[N];
     13   int fa[N], c[N][2], sum[N], mx[N], val[N];
     14   bool rev[N];
     15    
     16   bool isroot(int x){
     17     return L(fa[x]) != x && R(fa[x]) != x;
     18   }
     19  
     20   void pushdown(int x){
     21     int l = L(x), r = R(x);
     22  
     23     if(rev[x]){
     24       rev[x] ^= 1; rev[l] ^= 1; rev[r] ^= 1;
     25       swap(L(x), R(x));
     26     }
     27   }
     28  
     29   void pushup(int x){
     30     int l = L(x), r = R(x);
     31  
     32     sum[x] = sum[l] + sum[r] + val[x];
     33     mx[x] = max(val[x], max(mx[l], mx[r]));
     34   }
     35  
     36   void rotate(int x){
     37     int y = fa[x], z = fa[y], l, r;
     38  
     39     l = (L(y) == x) ^ 1; r = l ^ 1;
     40     if(!isroot(y))
     41       c[z][(L(z) == y) ^ 1] = x;
     42     fa[x] = z; fa[y] = x; fa[c[x][r]] = y;
     43     c[y][l] = c[x][r]; c[x][r] = y;
     44   }
     45  
     46   void splay(int x){
     47     top = 0;
     48     st[++ top] = x;
     49     for(int i = x; !isroot(i); i = fa[i])
     50       st[++ top] = fa[i];
     51     while(top) pushdown(st[top --]);
     52     while(!isroot(x)){
     53       int y = fa[x], z = fa[y];
     54  
     55       if(!isroot(y)){
     56         if(L(y) == x ^ L(z) == y) rotate(x);
     57         else rotate(y);
     58       }
     59       rotate(x);
     60     }
     61   }
     62 }Splay;
     63  
     64 struct LinkCutTree{
     65  
     66   void Access(int x){
     67     int t = 0;
     68  
     69     while(x){
     70       Splay.splay(x);
     71       Splay.R(x) = t;
     72       t = x; x = Splay.fa[x];
     73     }
     74   }
     75  
     76   void makeroot(int x){
     77     Access(x); Splay.splay(x); Splay.rev[x] ^= 1;
     78   }
     79  
     80   void link(int x, int y){
     81     makeroot(x); Splay.fa[x] = y; Splay.splay(x);
     82   }
     83  
     84   void cut(int x, int y){
     85     makeroot(x); Access(y); Splay.splay(y);
     86     Splay.L(y) = Splay.fa[x] = 0;
     87   }
     88  
     89   int findroot(int x){
     90     Access(x); Splay.splay(x);
     91     int y = x;
     92     while(Splay.L(y)) y = Splay.L(y);
     93  
     94     return y;
     95   }
     96 }lct;
     97  
     98 int n, m, x, y;
     99 char str[10];
    100  
    101 int main(){
    102   scanf("%d%d", &n, &m);
    103   for(int i = 1; i <= m; ++ i){
    104     scanf("%s%d%d", str, &x, &y);
    105  
    106     if(str[0] == 'C') lct.link(x, y);
    107     else if(str[0] == 'D') lct.cut(x, y);
    108     else{
    109       if(lct.findroot(x) == lct.findroot(y)) printf("Yes
    ");
    110       else printf("No
    ");
    111     }
    112   }
    113  
    114   return 0;
    115 }
    BZOJ 2049

    题目2: BZOJ 1180 OTOCI

      1 #include <bits/stdc++.h>
      2 #define L(x) c[x][0]
      3 #define R(x) c[x][1]
      4  
      5 using namespace std;
      6  
      7 typedef long long ll;
      8 const int N = 30000 + 5;
      9 const int oo = 0x3f3f3f3f;
     10  
     11 struct SplayTree{
     12   int fa[N], c[N][2];
     13   ll val[N], mx[N], sum[N];
     14   bool rev[N];
     15   int top, st[N];
     16  
     17   inline bool isroot(int x){
     18     return L(fa[x]) != x && R(fa[x]) != x;
     19   }
     20  
     21   void pushdown(int x){
     22     int l = L(x), r = R(x);
     23  
     24     if(rev[x]){
     25       rev[x] ^= 1; rev[l] ^= 1; rev[r] ^= 1;
     26       swap(L(x), R(x));
     27     }
     28   }
     29  
     30   void pushup(int x){
     31     int l = L(x), r = R(x);
     32  
     33     sum[x] = sum[l] + sum[r] + val[x];
     34     mx[x] = max(val[x], max(mx[l], mx[r]));
     35   }
     36  
     37   void rotate(int x){
     38     int y = fa[x], z = fa[y], l, r;
     39  
     40     l = (L(y) == x) ^ 1; r = l ^ 1;
     41     if(!isroot(y)){
     42       c[z][(L(z) == y) ^ 1] = x;
     43     }
     44     fa[x] = z; fa[y] = x; fa[c[x][r]] = y;
     45     c[y][l] = c[x][r]; c[x][r] = y;
     46     pushup(y); pushup(x);
     47   }
     48  
     49   void splay(int x){
     50     top = 0;
     51     st[++ top] = x;
     52  
     53     for(int i = x; !isroot(i); i = fa[i])
     54       st[++ top] = fa[i];
     55     while(top) pushdown(st[top --]);
     56     while(!isroot(x)){
     57       int y = fa[x], z = fa[y];
     58  
     59       if(!isroot(y)){
     60         if(L(y) == x ^ L(z) == y) rotate(x);
     61         else rotate(y);
     62       }
     63       rotate(x);
     64     }
     65   }
     66 }Splay;
     67  
     68 struct LinkCutTree{
     69   void Access(int x){
     70     int t = 0;
     71  
     72     while(x){
     73       Splay.splay(x);
     74       Splay.R(x) = t;
     75       t = x;
     76       Splay.pushup(x);
     77       x = Splay.fa[x];
     78     }
     79   }
     80  
     81   void makeroot(int x){
     82     Access(x); Splay.splay(x); Splay.rev[x] ^= 1;
     83   }
     84  
     85   void link(int x, int y){
     86     makeroot(x); Splay.fa[x] = y; Splay.splay(x);
     87   }
     88  
     89   void cut(int x, int y){
     90     makeroot(x); Access(y); Splay.splay(y);
     91     Splay.L(y) = Splay.fa[x] = 0;
     92   }
     93  
     94   int findroot(int x){
     95     Access(x); Splay.splay(x);
     96  
     97     int y = x;
     98  
     99     while(Splay.L(y)){
    100       y = Splay.L(y);
    101     }
    102  
    103     return y;
    104   }
    105 }lct;
    106  
    107 int n, m, x, y;
    108 char str[20];
    109  
    110 int main(){
    111   scanf("%d", &n);
    112   for(int i = 1; i <= n; ++ i){
    113     scanf("%lld", &Splay.val[i]);
    114     Splay.sum[i] = Splay.val[i];
    115   }
    116   scanf("%d", &m);
    117   for(int i = 1; i <= m; ++ i){
    118     scanf("%s%d%d", str, &x, &y);
    119  
    120     if(str[0] == 'b'){
    121       if(lct.findroot(x) == lct.findroot(y))
    122         puts("no");
    123       else{
    124         puts("yes"); lct.link(x, y);
    125       } 
    126     }
    127     else if(str[0] == 'e'){
    128       if(lct.findroot(x) != lct.findroot(y)){
    129         puts("impossible");
    130       }
    131       else{
    132         lct.makeroot(x); lct.Access(y); Splay.splay(y);
    133         printf("%lld
    ", Splay.sum[y]);
    134       }
    135     }
    136     else{
    137       lct.makeroot(x); Splay.val[x] = y; Splay.pushup(x);
    138     }
    139   }
    140  
    141   return 0;
    142 }
    BZOJ 1180

    题目3:BZOJ 3282 TREE

      1 #include <bits/stdc++.h>
      2 #define L(x) c[x][0]
      3 #define R(x) c[x][1]
      4  
      5 using namespace std;
      6  
      7 const int N = 300000 + 5;
      8  
      9 struct SplayTree{
     10   int fa[N], c[N][2], val[N], sum[N];
     11   bool rev[N];
     12   int top, st[N];
     13  
     14   inline bool isroot(int x){
     15     return L(fa[x]) != x && R(fa[x]) != x;
     16   }
     17  
     18   void pushup(int x){
     19     int l = L(x), r = R(x);
     20  
     21     sum[x] = sum[l] ^ sum[r] ^ val[x];
     22   }
     23   void pushdown(int x){
     24     int l = L(x), r = R(x);
     25  
     26     if(rev[x]){
     27       rev[x] ^= 1; rev[l] ^= 1; rev[r] ^= 1;
     28       swap(L(x), R(x));
     29     }
     30   }
     31   void rotate(int x){
     32     int y = fa[x], z = fa[y], l, r;
     33  
     34     l = (L(y) == x) ^ 1; r = l ^ 1;
     35  
     36     if(!isroot(y)){
     37       c[z][(L(z) == y) ^ 1] = x;
     38     }
     39     fa[y] = x; fa[x] = z; fa[c[x][r]] = y;
     40     c[y][l] = c[x][r]; c[x][r] = y;
     41     pushup(y); pushup(x);
     42   }
     43  
     44   void splay(int x){
     45     top = 0;
     46     st[++ top] = x;
     47     for(int i = x; !isroot(i); i = fa[i])
     48       st[++ top] = fa[i];
     49  
     50     while(top) pushdown(st[top --]);
     51     while(!isroot(x)){
     52       int y = fa[x], z = fa[y];
     53  
     54       if(!isroot(y)){
     55         if(L(y) == x ^ L(z) == y) rotate(x);
     56         else rotate(y);
     57       }
     58       rotate(x);
     59     }
     60   }
     61 }Splay;
     62  
     63 struct LinkCutTree{
     64   void Access(int x){
     65     int t = 0;
     66  
     67     while(x){
     68       Splay.splay(x);
     69       Splay.R(x) = t;
     70       t = x;
     71       Splay.pushup(x);
     72       x = Splay.fa[x];
     73     }
     74   }
     75  
     76   void makeroot(int x){
     77     Access(x); Splay.splay(x); Splay.rev[x] ^= 1;
     78   }
     79  
     80   int findroot(int x){
     81     Access(x); Splay.splay(x);
     82  
     83     int y = x;
     84  
     85     while(Splay.L(y)) y = Splay.L(y);
     86  
     87     return y;
     88   }
     89  
     90   void link(int x, int y){
     91     makeroot(x); Splay.fa[x] = y; Splay.splay(x);
     92   }
     93  
     94   void cut(int x, int y){
     95     makeroot(x); Access(y); Splay.splay(y);
     96     Splay.L(y) = Splay.fa[x] = 0;
     97   }
     98 }lct;
     99  
    100 int n, m;
    101 int x, y, z;
    102  
    103 int main(){
    104   scanf("%d%d", &n, &m);
    105   for(int i = 1; i <= n; ++ i){
    106     scanf("%d", &Splay.val[i]);
    107     Splay.sum[i] = Splay.val[i];
    108   }
    109   for(int i = 1; i <= m; ++ i){
    110     scanf("%d%d%d", &z, &x, &y);
    111  
    112     switch(z){
    113     case 0:{
    114       lct.makeroot(x); lct.Access(y); Splay.splay(y);
    115       printf("%d
    ", Splay.sum[y]);
    116       break;
    117     }
    118     case 1:{
    119       if(lct.findroot(x) != lct.findroot(y)){
    120         lct.link(x, y);
    121       }
    122       break;
    123     }
    124     case 2:{
    125       if(lct.findroot(x) == lct.findroot(y)){
    126         lct.cut(x, y);
    127       }
    128       break;
    129     }
    130     case 3:{
    131       lct.Access(x); Splay.splay(x); Splay.val[x] = y;
    132       Splay.pushup(x);
    133       break;
    134     }
    135     }
    136   }
    137  
    138   return 0;
    139 }
    BZOJ 3282

    题目4: HDU 4010 Query On The Trees

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <cstdlib>
      4 #include <algorithm>
      5 #include <iostream>
      6 #define L(x) c[x][0]
      7 #define R(x) c[x][1]
      8 
      9 using namespace std;
     10 
     11 const int N = 300000 + 5;
     12 const int oo = 0x3f3f3f3f;
     13 
     14 int n, m, tot;
     15 int first[N], nxt[N<<1];
     16 int u[N<<1], v[N<<1];
     17 int que[N<<1];
     18 
     19 struct SplayTree{
     20   int fa[N], c[N][2], val[N], mx[N], add[N];
     21   bool rev[N];
     22   int top, st[N];
     23 
     24   inline bool isroot(int x){
     25     return L(fa[x]) != x && R(fa[x]) != x;
     26   }
     27 
     28   void pushup(int x){
     29     int l = L(x), r = R(x);
     30     
     31     mx[x] = max(mx[l], mx[r]);
     32     mx[x] = max(mx[x], val[x]);
     33   }
     34   
     35   void pushdown(int x){
     36     int l = L(x), r = R(x);
     37 
     38     if(rev[x]){
     39       rev[x] ^= 1; rev[l] ^= 1; rev[r] ^= 1;
     40       swap(L(x), R(x));
     41     }
     42     if(add[x]){
     43       if(l){
     44         add[l] += add[x]; mx[l] += add[x]; val[l] += add[x];
     45       }
     46       if(r){
     47         add[r] += add[x]; mx[r] += add[x]; val[r] += add[x];
     48       }
     49       add[x] = 0;
     50     }
     51   }
     52 
     53   void rotate(int x){
     54     int y = fa[x], z = fa[y], l, r;
     55 
     56     l = (L(y) == x) ^ 1; r = l ^ 1;
     57     if(!isroot(y)){
     58       c[z][L(z) == y ^ 1] = x;
     59     }
     60     fa[x] = z; fa[y] = x; fa[c[x][r]] = y;
     61     c[y][l] = c[x][r]; c[x][r] = y;
     62     pushup(y); pushup(x);
     63   }
     64 
     65   void splay(int x){
     66     top = 0;
     67     st[++ top] = x;
     68     for(int i = x; !isroot(i); i = fa[i])
     69       st[++ top] = fa[i];
     70     while(top) pushdown(st[top --]);
     71     while(!isroot(x)){
     72       int y = fa[x], z = fa[y];
     73 
     74       if(!isroot(y)){
     75         if(L(y) == x ^ L(z) == y) rotate(x);
     76         else rotate(y);
     77       }
     78       rotate(x);
     79     }
     80   }
     81 }Splay;
     82 
     83 struct LinkCutTree{
     84   void Access(int x){
     85     int t = 0;
     86 
     87     while(x){
     88       Splay.splay(x);
     89       Splay.R(x) = t;
     90       t = x;
     91       Splay.pushup(x);
     92       x = Splay.fa[x];
     93     }
     94   }
     95   void Add(int x, int y, int w){
     96     makeroot(x); Access(y); Splay.splay(y);
     97     Splay.add[y] += w; Splay.val[y] += w; 
     98     Splay.mx[y] += w; 
     99   }
    100   int findroot(int x){
    101     Access(x); Splay.splay(x);
    102 
    103     int y = x;
    104 
    105     while(Splay.L(y)){
    106       y = Splay.L(y);
    107     }
    108 
    109     return y;
    110   }
    111 
    112   void makeroot(int x){
    113     Access(x); Splay.splay(x); Splay.rev[x] ^= 1;
    114   }
    115 
    116   void cut(int x, int y){
    117     makeroot(x); Access(y); Splay.splay(y);
    118     Splay.L(y) = Splay.fa[Splay.L(y)] = 0; Splay.pushup(y);
    119   }
    120 
    121   void link(int x, int y){
    122     makeroot(x); Splay.fa[x] = y; Splay.splay(x);
    123   }
    124 }lct;
    125 
    126 void insert(int s, int t){
    127   ++ tot;
    128   u[tot] = s; v[tot] = t;
    129   nxt[tot] = first[s];
    130   first[s] = tot;
    131 }
    132 
    133 void bfs(){
    134   int head, tail;
    135   head = tail = 1;
    136   que[head] = 1;
    137   Splay.fa[1] = 0;
    138   
    139   while(head <= tail){
    140     int x = que[head];
    141 
    142     for(int i = first[x]; i; i = nxt[i]){
    143       if(v[i] != Splay.fa[x]){
    144         Splay.fa[v[i]] = x;
    145         que[++ tail] = v[i];
    146       }
    147     }
    148     ++ head;
    149   }
    150 }
    151 
    152 int main(){
    153   int flag, x, y, z;
    154   
    155   while(~scanf("%d", &n)){
    156     tot = 0;
    157     for(int i = 0; i <= n; ++ i){
    158       Splay.fa[i] = Splay.val[i] = Splay.add[i] = 0;
    159       Splay.rev[i] = false;
    160       Splay.mx[i] = -oo;
    161       Splay.c[i][0] = Splay.c[i][1] = 0;
    162       first[i] = 0;
    163     }
    164     for(int i = 1; i < n; ++ i){
    165       scanf("%d%d", &x, &y);
    166       insert(x, y); insert(y, x);
    167     }
    168     for(int i = 1; i <= n; ++ i){
    169       scanf("%d", &x);
    170       Splay.val[i] = Splay.mx[i] = x;
    171     }
    172     bfs();
    173 
    174     scanf("%d", &m);
    175     for(int i = 1; i <= m; ++ i){
    176       scanf("%d", &flag);
    177       switch(flag){
    178       case 1:{
    179         scanf("%d%d", &x, &y);
    180         if(lct.findroot(x) == lct.findroot(y))
    181           puts("-1");
    182         else
    183           lct.link(x, y);
    184         break;
    185       }
    186       case 2:{
    187         scanf("%d%d", &x, &y);
    188         if(lct.findroot(x) != lct.findroot(y) || x == y)
    189           puts("-1");
    190         else lct.cut(x, y);
    191         break;
    192       }
    193       case 3:{
    194         scanf("%d%d%d", &z, &x, &y);
    195         if(lct.findroot(x) != lct.findroot(y))
    196           puts("-1");
    197         else
    198           lct.Add(x, y, z);
    199         break;
    200       }
    201       case 4:{
    202         scanf("%d%d", &x, &y);
    203         if(lct.findroot(x) != lct.findroot(y))
    204           puts("-1");
    205         else{
    206           lct.makeroot(x); lct.Access(y); Splay.splay(y);
    207           printf("%d
    ", Splay.mx[y]);
    208         }
    209         break;
    210       }
    211       }
    212     }
    213     puts("");
    214   }
    215 
    216   return 0;
    217 }
    HDU 4010
  • 相关阅读:
    php环境配置中各个模块在网站建设中的功能
    PHP+Apache+MySQL+phpMyAdmin在win7系统下的环境配置
    August 17th 2017 Week 33rd Thursday
    August 16th 2017 Week 33rd Wednesday
    August 15th 2017 Week 33rd Tuesday
    August 14th 2017 Week 33rd Monday
    August 13th 2017 Week 33rd Sunday
    August 12th 2017 Week 32nd Saturday
    August 11th 2017 Week 32nd Friday
    August 10th 2017 Week 32nd Thursday
  • 原文地址:https://www.cnblogs.com/sxprovence/p/5164525.html
Copyright © 2011-2022 走看看