• 【POJ】3237 Tree


      1 #include<cstdio>
      2 #include<cstring>
      3 #include<queue>
      4 #include<iostream>
      5 #include<algorithm>
      6 #define MAXN 100010
      7 #define MAXM 200010
      8 #define oo 0x7FFFFFFF
      9 using namespace std;
     10 bool vis[MAXN];
     11 int first[MAXN], next[MAXM], v[MAXM], cost[MAXM], e;
     12 struct LCT {
     13     bool neg[MAXN];
     14     int maxi[MAXN], mini[MAXN];
     15     int bef[MAXN], belong[MAXN];
     16     int next[MAXN][2], pre[MAXN], key[MAXN];
     17     void Init() {
     18         memset(next, 0, sizeof(next));
     19         memset(pre, 0, sizeof(pre));
     20         memset(neg, false, sizeof(neg));
     21         maxi[0] = -oo;
     22         mini[0] = oo;
     23     }
     24     inline void PushUp(int x) {
     25         maxi[x] = key[x];
     26         if (next[x][0])
     27             maxi[x] = max(maxi[x], maxi[next[x][0]]);
     28         if (next[x][1])
     29             maxi[x] = max(maxi[x], maxi[next[x][1]]);
     30         mini[x] = key[x];
     31         if (next[x][0])
     32             mini[x] = min(mini[x], mini[next[x][0]]);
     33         if (next[x][1])
     34             mini[x] = min(mini[x], mini[next[x][1]]);
     35     }
     36     inline void Not(int x) {
     37         if (x) {
     38             neg[x] ^= true;
     39             swap(maxi[x], mini[x]);
     40             key[x] = -key[x];
     41             maxi[x] = -maxi[x];
     42             mini[x] = -mini[x];
     43         }
     44     }
     45     inline void PushDown(int x) {
     46         if (neg[x]) {
     47             Not(next[x][0]);
     48             Not(next[x][1]);
     49             neg[x] = false;
     50         }
     51     }
     52     void Rotate(int x, int kind) {
     53         int y, z;
     54         y = pre[x];
     55         z = pre[y];
     56         PushDown(y);
     57         PushDown(x);
     58         next[y][!kind] = next[x][kind];
     59         pre[next[x][kind]] = y;
     60         next[z][next[z][1] == y] = x;
     61         pre[x] = z;
     62         next[x][kind] = y;
     63         pre[y] = x;
     64         PushUp(y);
     65     }
     66     void Splay(int x) {
     67         int rt;
     68         for (rt = x; pre[rt]; rt = pre[rt])
     69             ;
     70         if (rt != x) {
     71             bef[x] = bef[rt];
     72             bef[rt] = 0;
     73             PushDown(x);
     74             while (pre[x]) {
     75                 if (next[pre[x]][0] == x)
     76                     Rotate(x, 1);
     77                 else
     78                     Rotate(x, 0);
     79             }
     80             PushUp(x);
     81         }
     82     }
     83     void Access(int x) {
     84         int father;
     85         for (father = 0; x; x = bef[x]) {
     86             Splay(x);
     87             PushDown(x);
     88             pre[next[x][1]] = 0;
     89             bef[next[x][1]] = x;
     90             next[x][1] = father;
     91             pre[father] = x;
     92             bef[father] = 0;
     93             father = x;
     94             PushUp(x);
     95         }
     96     }
     97     void Change(int x, int y) {
     98         int t;
     99         t = belong[x - 1];
    100         Splay(t);
    101         key[t] = y;
    102     }
    103     void Negate(int x, int y) {
    104         Access(y);
    105         for (y = 0; x; x = bef[x]) {
    106             Splay(x);
    107             if (!bef[x]) {
    108                 Not(y);
    109                 Not(next[x][1]);
    110                 return;
    111             }
    112             PushDown(x);
    113             pre[next[x][1]] = 0;
    114             bef[next[x][1]] = x;
    115             next[x][1] = y;
    116             pre[y] = x;
    117             bef[y] = 0;
    118             y = x;
    119             PushUp(x);
    120         }
    121     }
    122     int Query(int x, int y) {
    123         Access(y);
    124         for (y = 0; x; x = bef[x]) {
    125             Splay(x);
    126             if (!bef[x])
    127                 return max(maxi[y], maxi[next[x][1]]);
    128             PushDown(x);
    129             pre[next[x][1]] = 0;
    130             bef[next[x][1]] = x;
    131             next[x][1] = y;
    132             pre[y] = x;
    133             bef[y] = 0;
    134             y = x;
    135             PushUp(x);
    136         }
    137         return 0;
    138     }
    139 } lct;
    140 int INT() {
    141     char ch;
    142     int res;
    143     bool neg;
    144     while (ch = getchar(), !isdigit(ch) && ch != '-')
    145         ;
    146     if (ch == '-') {
    147         res = 0;
    148         neg = true;
    149     } else {
    150         res = ch - '0';
    151         neg = false;
    152     }
    153     while (ch = getchar(), isdigit(ch))
    154         res = res * 10 + ch - '0';
    155     return neg ? -res : res;
    156 }
    157 char CHAR() {
    158     char ch, res;
    159     while (res = getchar(), !isalpha(res))
    160         ;
    161     while (ch = getchar(), isalpha(ch))
    162         ;
    163     return res;
    164 }
    165 inline void AddEdge(int x, int y, int val) {
    166     v[e] = y;
    167     cost[e] = val;
    168     next[e] = first[x];
    169     first[x] = e++;
    170 }
    171 void BFS(int x) {
    172     int i, y;
    173     queue<int> q;
    174     memset(vis, false, sizeof(vis));
    175     vis[x] = true;
    176     q.push(x);
    177     while (!q.empty()) {
    178         x = q.front();
    179         q.pop();
    180         for (i = first[x]; i != -1; i = next[i]) {
    181             y = v[i];
    182             if (!vis[y]) {
    183                 lct.bef[y] = x;
    184                 lct.key[y] = cost[i];
    185                 lct.belong[i >> 1] = y;
    186                 vis[y] = true;
    187                 q.push(y);
    188             }
    189         }
    190     }
    191 }
    192 int main() {
    193     int c, i;
    194     char ch;
    195     int n, x, y, val;
    196     c = INT();
    197     while (c--) {
    198         n = INT();
    199         lct.Init();
    200         memset(first, -1, sizeof(first));
    201         for (e = 0, i = 1; i < n; i++) {
    202             x = INT(), y = INT(), val = INT();
    203             AddEdge(x, y, val);
    204             AddEdge(y, x, val);
    205         }
    206         BFS(1);
    207         while (ch = CHAR(), ch != 'D') {
    208             x = INT(), y = INT();
    209             if (ch == 'Q')
    210                 printf("%d\n", lct.Query(x, y));
    211             else if (ch == 'C')
    212                 lct.Change(x, y);
    213             else
    214                 lct.Negate(x, y);
    215         }
    216     }
    217     return 0;
    218 }
  • 相关阅读:
    LINUX下Mplayer的设置和作用
    C#的New关键字的几种用法
    Windows Mobile中实现统计图形的绘制(C#版,柱状图)
    maven install时跳过测试
    深入理解Java虚拟机二 阅读笔记
    VMware上安装虚拟机教程
    巴菲特的人生观
    全球15个顶级技术类博客
    针对Android里没有Arrays.CopyOf的解决办法
    Android基础project各个文件夹作用
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2653294.html
Copyright © 2020-2023  润新知