zoukankan      html  css  js  c++  java
  • 【SPOJ】375 Query on a tree

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<queue>
      4 #include<iostream>
      5 #include<algorithm>
      6 #define MAXN 10010
      7 #define MAXM 20010
      8 #define oo 0x7FFFFFFF
      9 using namespace std;
     10 int first[MAXN], next[MAXM], v[MAXM], cost[MAXM], e;
     11 bool vis[MAXN];
     12 struct LCT {
     13     int next[MAXN][2], pre[MAXN], val[MAXN], belong[MAXN], bef[MAXN], key[MAXN];
     14     void Init() {
     15         memset(next, 0, sizeof(next));
     16         memset(pre, 0, sizeof(pre));
     17         val[0] = key[0] = -oo;
     18     }
     19     inline void PushUp(int x) {
     20         val[x] = max(key[x], max(val[next[x][0]], val[next[x][1]]));
     21     }
     22     inline void Rotate(int x, int kind) {
     23         int y, z;
     24         y = pre[x];
     25         z = pre[y];
     26         next[y][!kind] = next[x][kind];
     27         pre[next[x][kind]] = y;
     28         next[z][next[z][1] == y] = x;
     29         pre[x] = z;
     30         next[x][kind] = y;
     31         pre[y] = x;
     32         PushUp(y);
     33     }
     34     void Splay(int x) {
     35         int rt;
     36         for (rt = x; pre[rt]; rt = pre[rt])
     37             ;
     38         if (rt != x) {
     39             bef[x] = bef[rt];
     40             bef[rt] = 0;
     41             while (pre[x]) {
     42                 if (next[pre[x]][0] == x)
     43                     Rotate(x, 1);
     44                 else
     45                     Rotate(x, 0);
     46             }
     47             PushUp(x);
     48         }
     49     }
     50     void Access(int x) {
     51         int father;
     52         for (father = 0; x; x = bef[x]) {
     53             Splay(x);
     54             bef[next[x][1]] = x;
     55             bef[father] = 0;
     56             pre[next[x][1]] = 0;
     57             next[x][1] = father;
     58             pre[father] = x;
     59             father = x;
     60             PushUp(x);
     61         }
     62     }
     63     int Query(int x, int y) {
     64         Access(y);
     65         for (y = 0; x; x = bef[x]) {
     66             Splay(x);
     67             if (!bef[x])
     68                 return max(val[y], val[next[x][1]]);
     69             bef[next[x][1]] = x;
     70             bef[y] = 0;
     71             pre[next[x][1]] = 0;
     72             next[x][1] = y;
     73             pre[y] = x;
     74             y = x;
     75             PushUp(x);
     76         }
     77         return 0;
     78     }
     79     void Change(int x, int y) {
     80         int t;
     81         t = belong[x - 1];
     82         key[t] = y;
     83         Splay(t);
     84     }
     85 } lct;
     86 int INT() {
     87     int res;
     88     char ch;
     89     bool neg;
     90     while (ch = getchar(), !isdigit(ch) && ch != '-')
     91         ;
     92     if (ch == '-') {
     93         neg = true;
     94         res = 0;
     95     } else {
     96         neg = false;
     97         res = ch - '0';
     98     }
     99     while (ch = getchar(), isdigit(ch))
    100         res = res * 10 + ch - '0';
    101     return neg ? -res : res;
    102 }
    103 char CHAR() {
    104     char res, ch;
    105     while (res = getchar(), !isalpha(res))
    106         ;
    107     while (ch = getchar(), isalpha(ch))
    108         ;
    109     return res;
    110 }
    111 inline void AddEdge(int x, int y, int val) {
    112     v[e] = y;
    113     cost[e] = val;
    114     next[e] = first[x];
    115     first[x] = e++;
    116 }
    117 void BFS(int x) {
    118     int i, y;
    119     queue<int> q;
    120     memset(vis, false, sizeof(vis));
    121     vis[x] = true;
    122     q.push(x);
    123     while (!q.empty()) {
    124         x = q.front();
    125         q.pop();
    126         for (i = first[x]; i != -1; i = next[i]) {
    127             y = v[i];
    128             if (!vis[y]) {
    129                 lct.bef[y] = x;
    130                 lct.key[y] = lct.val[y] = cost[i];
    131                 lct.belong[i >> 1] = y;
    132                 vis[y] = true;
    133                 q.push(y);
    134             }
    135         }
    136     }
    137 }
    138 int main() {
    139     int c;
    140     char ch;
    141     int n, i;
    142     int u, v, w;
    143     c = INT();
    144     while (c--) {
    145         lct.Init();
    146         n = INT();
    147         memset(first, -1, sizeof(first));
    148         for (e = 0, i = 1; i < n; i++) {
    149             u = INT(), v = INT(), w = INT();
    150             AddEdge(u, v, w);
    151             AddEdge(v, u, w);
    152         }
    153         BFS(1);
    154         while (ch = CHAR(), ch != 'D') {
    155             u = INT(), v = INT();
    156             if (ch == 'Q')
    157                 printf("%d\n", lct.Query(u, v));
    158             else
    159                 lct.Change(u, v);
    160         }
    161     }
    162     return 0;
    163 }
  • 相关阅读:
    C盘与D盘中间有个恢复分区,导致C盘不能扩展卷解决
    Win下,QT控制台无输出解决
    QT与ECharts交互,绘制曲线图
    博客园好看的自定义主题
    Qt5之控件在初始化时就触发了槽函数的问题解决方案
    使用QCustomPlot,跟随鼠标动态显示线上点的值
    QCustomPlot下setTickLabelType()函数在新版本被移除如何解决
    记一次QT使用QAxWidget打开.html文件调用显示离线百度地图不能缩放,自定义图片不能显示解决方法
    使用QPainter绘制汽车仪表盘,动态显示
    QT下使用百度地图js,发送角度值给js使小车根据角度值调整车头方向
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2650117.html
Copyright © 2011-2022 走看看