zoukankan      html  css  js  c++  java
  • BZOJ3282 Tree

    论什么是LCT?蒟蒻也不造。。。

    splay写错是shen me gui = =

    话说,要注意翻转标记!!!

    还是要注意link & cut的写法啊喂!

      1 /**************************************************************
      2     Problem: 3282
      3     User: rausen
      4     Language: C++
      5     Result: Accepted
      6     Time:1732 ms
      7     Memory:7840 kb
      8 ****************************************************************/
      9  
     10 #include <cstdio>
     11 #include <algorithm>
     12  
     13 using namespace std;
     14 const int N = 300005;
     15  
     16 struct splay_node {
     17   int v, res, rev;
     18   int fa, son[2];
     19 } tr[N];
     20  
     21 int n;
     22  
     23 inline int read() {
     24   int x = 0, sgn = 1;
     25   char ch = getchar();
     26   while (ch < '0' || '9' < ch) {
     27     if (ch == '-') sgn = -1;
     28     ch = getchar();
     29   }
     30   while ('0' <= ch && ch <= '9') {
     31     x = x * 10 + ch - '0';
     32     ch = getchar();
     33   }
     34   return sgn * x;
     35 }
     36  
     37 #define lson tr[p].son[0]
     38 #define rson tr[p].son[1]
     39 #define Rev tr[p].rev
     40 #define Res tr[p].res
     41 #define V tr[p].v
     42 #define Fa tr[p].fa
     43 inline void update(int p) {
     44   tr[0].res = 0;
     45   Res = tr[lson].res ^ tr[rson].res ^ V;
     46 }
     47  
     48 inline void push_down(int p) {
     49   if (p && Rev) {
     50     swap(lson, rson);
     51     tr[lson].rev ^= 1, tr[rson].rev ^= 1;
     52     Rev = 0;
     53   }
     54 }
     55  
     56 inline bool is_root(int p) {
     57   return Fa == 0 || (tr[Fa].son[0] != p && tr[Fa].son[1] != p);
     58 }
     59  
     60 inline void rotate(int p) {
     61   int fa = tr[p].fa, gr = tr[fa].fa;
     62   int l = (tr[fa].son[1] == p), r = !l;
     63   if (!is_root(fa)) tr[gr].son[tr[gr].son[1] == fa] = p;
     64   tr[p].fa = gr, tr[fa].fa = p, tr[tr[p].son[r]].fa = fa;
     65   tr[fa].son[l] = tr[p].son[r], tr[p].son[r] = fa;
     66   update(fa), update(p);
     67 }
     68  
     69 void splay(int p) {
     70   int fa, gr;
     71   while (!is_root(p)) {
     72     fa = tr[p].fa, gr = tr[fa].fa;
     73     push_down(gr), push_down(fa), push_down(p);
     74     if (!is_root(fa))
     75       if ((fa == tr[gr].son[0]) ^ (p == tr[fa].son[0])) rotate(p);
     76       else rotate(fa);
     77     rotate(p);
     78   }
     79   push_down(p);
     80 }
     81  
     82  
     83 void access(int p) {
     84   int t;
     85   for (t = 0; p; t = p, p = Fa) {
     86     splay(p);
     87     rson = t, update(p);
     88   }
     89 }
     90  
     91 void make_root(int p) {
     92   access(p), splay(p);
     93   Rev ^= 1;
     94 }
     95  
     96 int find_root(int p) {
     97   access(p), splay(p);
     98   while (lson) {
     99     push_down(p);
    100     p = lson;
    101   }
    102   return p;
    103 }
    104  
    105  
    106 void cut(int x, int y) {
    107   make_root(x);
    108   access(y), splay(y);
    109   if (tr[y].son[0] == x && tr[x].son[1] == 0)
    110     tr[y].son[0] = tr[x].fa = 0, update(y);
    111 }
    112  
    113 void link(int x, int y) {
    114   make_root(x);
    115   tr[x].fa = y;
    116 }
    117  
    118 int main() {
    119   int i, Q, oper, x, y;
    120   n = read(), Q = read();
    121   for (i = 1; i <= n; ++i)
    122     tr[i].v = tr[i].res = read();
    123   while (Q--) {
    124     oper = read(), x = read(), y = read();
    125     if (oper == 0) {
    126       make_root(x);
    127       access(y), splay(y);
    128       printf("%d
    ", tr[y].res);
    129     } else if (oper == 1) {
    130       if (find_root(x) != find_root(y)) link(x, y);
    131     }
    132     else if (oper == 2) {
    133       if (find_root(x) == find_root(y)) cut(x, y);
    134     }
    135     else {
    136       access(x), splay(x);
    137       tr[x].v = y;
    138       update(x);
    139     }
    140   }
    141   return 0;
    142 }
    View Code

    (p.s.  不要问为什么窝改了代码风格。。。)

    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    Wannafly 挑战赛12 E
    HIT ACM 2018春 week2 codeforces.com/gym/101652 题解
    Hihocoder [Offer收割]编程练习赛49 题目4 : 第K小先序遍历
    HDU
    ZOJ
    HYSBZ
    POJ
    HYSBZ
    POJ 2796 Feel Good 题解
    逆元基本知识
  • 原文地址:https://www.cnblogs.com/rausen/p/4202440.html
Copyright © 2011-2022 走看看