• 【HDU】3966 Aragorn's Story


      1 #include<cstdio>
      2 #include<cstring>
      3 #include<queue>
      4 #include<iostream>
      5 #define MAXN 50010
      6 #define MAXM 100010
      7 using namespace std;
      8 struct LCT {
      9     int bef[MAXN];
     10     int next[MAXN][2], pre[MAXN], key[MAXN], add[MAXN];
     11     void Init() {
     12         memset(next, 0, sizeof(next));
     13         memset(pre, 0, sizeof(pre));
     14         memset(add, 0, sizeof(add));
     15     }
     16     void PushDown(int x) {
     17         if (add[x]) {
     18             int a, b;
     19             a = next[x][0], b = next[x][1];
     20             add[a] += add[x];
     21             add[b] += add[x];
     22             key[a] += add[x];
     23             key[b] += add[x];
     24             add[x] = 0;
     25         }
     26     }
     27     void Rotate(int x, int kind) {
     28         int y, z;
     29         y = pre[x];
     30         z = pre[y];
     31         PushDown(y);
     32         PushDown(x);
     33         next[y][!kind] = next[x][kind];
     34         pre[next[x][kind]] = y;
     35         next[z][next[z][1] == y] = x;
     36         pre[x] = z;
     37         next[x][kind] = y;
     38         pre[y] = x;
     39     }
     40     void Splay(int x) {
     41         int rt;
     42         for (rt = x; pre[rt]; rt = pre[rt])
     43             ;
     44         if (rt != x) {
     45             bef[x] = bef[rt];
     46             bef[rt] = 0;
     47             PushDown(x);
     48             while (pre[x]) {
     49                 if (next[pre[x]][0] == x)
     50                     Rotate(x, 1);
     51                 else
     52                     Rotate(x, 0);
     53             }
     54         }
     55     }
     56     void Access(int x) {
     57         int father;
     58         for (father = 0; x; x = bef[x]) {
     59             Splay(x);
     60             PushDown(x);
     61             pre[next[x][1]] = 0;
     62             bef[next[x][1]] = x;
     63             next[x][1] = father;
     64             pre[father] = x;
     65             bef[father] = 0;
     66             father = x;
     67         }
     68     }
     69     void Update(int x, int y, int val) {
     70         Access(y);
     71         for (y = 0; x; x = bef[x]) {
     72             Splay(x);
     73             if (!bef[x]) {
     74                 key[x] += val;
     75                 key[next[x][1]] += val;
     76                 key[y] += val;
     77                 add[next[x][1]] += val;
     78                 add[y] += val;
     79                 return;
     80             }
     81             PushDown(x);
     82             pre[next[x][1]] = 0;
     83             bef[next[x][1]] = x;
     84             next[x][1] = y;
     85             pre[y] = x;
     86             bef[y] = 0;
     87             y = x;
     88         }
     89     }
     90     int Query(int x) {
     91         Splay(x);
     92         return key[x];
     93     }
     94 } lct;
     95 bool vis[MAXN];
     96 int first[MAXN], next[MAXM], v[MAXM], e;
     97 int INT() {
     98     char ch;
     99     int res;
    100     bool neg;
    101     while (ch = getchar(), !isdigit(ch) && ch != '-')
    102         ;
    103     if (ch == '-') {
    104         neg = true;
    105         res = 0;
    106     } else {
    107         neg = false;
    108         res = ch - '0';
    109     }
    110     while (ch = getchar(), isdigit(ch))
    111         res = res * 10 + ch - '0';
    112     return neg ? -res : res;
    113 }
    114 char CHAR() {
    115     char res;
    116     while (res = getchar(), !isalpha(res))
    117         ;
    118     return res;
    119 }
    120 inline void AddEdge(int x, int y) {
    121     v[e] = y;
    122     next[e] = first[x];
    123     first[x] = e++;
    124 }
    125 void BFS(int x) {
    126     int i, y;
    127     queue<int> q;
    128     memset(vis, false, sizeof(vis));
    129     vis[x] = true;
    130     q.push(x);
    131     while (!q.empty()) {
    132         x = q.front();
    133         q.pop();
    134         for (i = first[x]; i != -1; i = next[i]) {
    135             y = v[i];
    136             if (!vis[y]) {
    137                 lct.bef[y] = x;
    138                 vis[y] = true;
    139                 q.push(y);
    140             }
    141         }
    142     }
    143 }
    144 int main() {
    145     char ch;
    146     int n, m, q, i;
    147     int x, y, val;
    148     while (~scanf("%d%d%d", &n, &m, &q)) {
    149         lct.Init();
    150         memset(first, -1, sizeof(first));
    151         for (e = 0, i = 1; i <= n; i++)
    152             lct.key[i] = INT();
    153         for (i = 0; i < m; i++) {
    154             x = INT(), y = INT();
    155             AddEdge(x, y);
    156             AddEdge(y, x);
    157         }
    158         BFS(1);
    159         while (q--) {
    160             ch = CHAR();
    161             if (ch == 'I') {
    162                 x = INT(), y = INT(), val = INT();
    163                 lct.Update(x, y, val);
    164             } else if (ch == 'D') {
    165                 x = INT(), y = INT(), val = INT();
    166                 lct.Update(x, y, -val);
    167             } else {
    168                 x = INT();
    169                 printf("%d\n", lct.Query(x));
    170             }
    171         }
    172     }
    173     return 0;
    174 }
  • 相关阅读:
    Centos7LDAP LDAPadmin的完整部署记录(改良版,其它文档太多坑)
    linux weblogic11g 部署
    redis离线集群安装
    Weblogic11g 10.3部署
    jdk安装部署
    tar.xz文件如何解压
    linux-Centos7安装python3并与python2共存
    ssh免密码登录配置方法
    Docker容器安装weblogic详细教程
    linux命令分块总结---多操作才是真理
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2653331.html
Copyright © 2020-2023  润新知