• Uva1553 Caves and Tunnels LCT


    简单题,主要为了练手。

      1 #include <cstdio>
      2 #include <iostream>
      3 #define maxn 100010
      4 using namespace std;
      5 
      6 namespace L {
      7     int pnt[maxn], pre[maxn], son[maxn][2], rtg[maxn], val[maxn], mxv[maxn];
      8 
      9     inline void update( int nd ) {
     10         mxv[nd] = max( val[nd], max(mxv[son[nd][0]],mxv[son[nd][1]]) );
     11     }
     12     void rotate( int nd, int d ) {
     13         int p = pre[nd];
     14         int s = son[nd][!d];
     15         int ss = son[s][d];
     16         son[nd][!d] = ss;
     17         son[s][d] = nd;
     18         if( p ) son[p][ nd==son[p][1] ] = s;
     19         else pnt[s] = pnt[nd];
     20         pre[nd] = s;
     21         pre[ss] = nd;
     22         pre[s] = p;
     23         update(nd);
     24         update(s);
     25     }
     26     void pushdown( int nd ) {
     27         if( rtg[nd] ) {
     28             int &ls=son[nd][0], &rs=son[nd][1];
     29             swap(ls,rs);
     30             rtg[ls] ^= 1;
     31             rtg[rs] ^= 1;
     32             rtg[nd] = 0;
     33         }
     34     }
     35     void bigpush( int nd ) {
     36         if( pre[nd] ) bigpush(pre[nd]);
     37         pushdown(nd);
     38     }
     39     void splay( int nd, int top=0 ) {
     40         bigpush(nd);
     41         while( pre[nd]!=top ) {
     42             int p = pre[nd];
     43             int nl = nd==son[p][0];
     44             if( pre[p]==top ) {
     45                 rotate( p, nl );
     46             } else {
     47                 int pp = pre[p];
     48                 int pl = p==son[pp][0];
     49                 if( nl==pl ) {
     50                     rotate( pp, pl );
     51                     rotate( p, nl );
     52                 } else {
     53                     rotate( p, nl );
     54                     rotate( pp, pl );
     55                 }
     56             }
     57         }
     58     }
     59     void access( int nd ) {
     60         int u = nd;
     61         int v = 0;
     62         while( u ) {
     63             splay(u);
     64             int s = son[u][1];
     65             pre[s] = 0;
     66             pnt[s] = u;
     67             pre[v] = u;
     68             son[u][1] = v;
     69             update(u);
     70             v = u;
     71             u = pnt[u];
     72         }
     73         splay(nd);
     74     }
     75     void init( int n ) {
     76         for( int i=0; i<=n; i++ )
     77             pnt[i] = pre[i] = son[i][0] = son[i][1] 
     78                 = rtg[i] = val[i] = mxv[i] = 0;
     79     }
     80     void makeroot( int nd ) {
     81         access(nd);
     82         rtg[nd] ^= 1;
     83     }
     84     void link( int u, int v ) {
     85         makeroot(u);
     86         makeroot(v);
     87         pnt[u] = v;
     88     }
     89     void inc_val( int nd, int w ) {
     90         splay( nd );
     91         val[nd] += w;
     92         update( nd );
     93     }
     94     int qu_max( int u, int v ) {
     95         makeroot(u);
     96         access(v);
     97         return max( val[v], mxv[son[v][0]] );
     98     }
     99 };
    100 
    101 int n, q;
    102 
    103 int main() {
    104     scanf( "%d", &n );
    105     L::init(n);
    106     for( int i=2,u,v; i<=n; i++ ) {
    107         scanf( "%d%d", &u, &v );
    108         L::link(u,v);
    109     }
    110     scanf( "%d", &q );
    111     while( q-- ) {
    112         char ch[10];
    113         int u, v, w;
    114         scanf( "%s", ch );
    115         if( ch[0]=='I' ) {
    116             scanf( "%d%d", &u, &w );
    117             L::inc_val(u,w);
    118         } else {
    119             scanf( "%d%d", &u, &v );
    120             printf( "%d
    ", L::qu_max(u,v) );
    121         }
    122     }
    123 }
    View Code
  • 相关阅读:
    Charles抓包工具的使用
    C++中引用(&)的用法和应用实例
    机器学习-斯坦福:学习笔记7-最优间隔分类器问题
    机器学习-斯坦福:学习笔记6-朴素贝叶斯
    机器学习-斯坦福:学习笔记5-生成学习算法
    机器学习-斯坦福:学习笔记4-牛顿方法
    机器学习-斯坦福:学习笔记3-欠拟合与过拟合概念
    机器学习-斯坦福:学习笔记2-监督学习应用与梯度下降
    机器学习-斯坦福:学习笔记1-机器学习的动机与应用
    相似性计算方法
  • 原文地址:https://www.cnblogs.com/idy002/p/4291010.html
Copyright © 2020-2023  润新知