zoukankan      html  css  js  c++  java
  • 【CodeForces】191C Fools and Roads

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<iostream>
      4 #include<queue>
      5 #define MAXN 100010
      6 #define MAXM 200010
      7 using namespace std;
      8 int first[MAXN], next[MAXM], v[MAXM], e;
      9 bool vis[MAXN];
     10 struct LCT {
     11     int bef[MAXN], belong[MAXN];
     12     int next[MAXN][2], pre[MAXN], key[MAXN], add[MAXN];
     13     void Init() {
     14         memset(next, 0, sizeof(next));
     15         memset(pre, 0, sizeof(pre));
     16     }
     17     inline void PushDown(int x) {
     18         if (add[x]) {
     19             int a, b;
     20             a = next[x][0], b = next[x][1];
     21             if (a) {
     22                 add[a] += add[x];
     23                 key[a] += add[x];
     24             }
     25             if (b) {
     26                 add[b] += add[x];
     27                 key[b] += add[x];
     28             }
     29             add[x] = 0;
     30         }
     31     }
     32     void Rotate(int x, int kind) {
     33         int y, z;
     34         y = pre[x];
     35         z = pre[y];
     36         PushDown(y);
     37         PushDown(x);
     38         next[y][!kind] = next[x][kind];
     39         pre[next[x][kind]] = y;
     40         next[z][next[z][1] == y] = x;
     41         pre[x] = z;
     42         next[x][kind] = y;
     43         pre[y] = x;
     44     }
     45     void Splay(int x) {
     46         int rt;
     47         for (rt = x; pre[rt]; rt = pre[rt])
     48             ;
     49         if (rt != x) {
     50             bef[x] = bef[rt];
     51             bef[rt] = 0;
     52             PushDown(x);
     53             while (pre[x]) {
     54                 if (next[pre[x]][0] == x)
     55                     Rotate(x, 1);
     56                 else
     57                     Rotate(x, 0);
     58             }
     59         }
     60     }
     61     void Access(int x) {
     62         int father;
     63         for (father = 0; x; x = bef[x]) {
     64             Splay(x);
     65             PushDown(x);
     66             bef[next[x][1]] = x;
     67             pre[next[x][1]] = 0;
     68             next[x][1] = father;
     69             pre[father] = x;
     70             bef[father] = 0;
     71             father = x;
     72         }
     73     }
     74     void Update(int x, int y) {
     75         Access(y);
     76         for (y = 0; x; x = bef[x]) {
     77             Splay(x);
     78             if (!bef[x]) {
     79                 if (next[x][1]) {
     80                     key[next[x][1]]++;
     81                     add[next[x][1]]++;
     82                 }
     83                 if (y) {
     84                     key[y]++;
     85                     add[y]++;
     86                 }
     87                 return;
     88             }
     89             PushDown(x);
     90             bef[next[x][1]] = x;
     91             pre[next[x][1]] = 0;
     92             next[x][1] = y;
     93             pre[y] = x;
     94             bef[y] = 0;
     95             y = x;
     96         }
     97     }
     98     int Query(int x) {
     99         Splay(x);
    100         return key[x];
    101     }
    102 } lct;
    103 int INT() {
    104     char ch;
    105     int res;
    106     while (ch = getchar(), !isdigit(ch))
    107         ;
    108     for (res = ch - '0'; ch = getchar(), isdigit(ch);)
    109         res = res * 10 + ch - '0';
    110     return res;
    111 }
    112 inline void AddEdge(int x, int y) {
    113     v[e] = y;
    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.add[y] = 0;
    131                 lct.belong[i >> 1] = y;
    132                 vis[y] = true;
    133                 q.push(y);
    134             }
    135         }
    136     }
    137 }
    138 int main() {
    139     int n, i, q, x, y;
    140     while (~scanf("%d", &n)) {
    141         lct.Init();
    142         memset(first, -1, sizeof(first));
    143         for (e = 0, i = 1; i < n; i++) {
    144             x = INT(), y = INT();
    145             AddEdge(x, y);
    146             AddEdge(y, x);
    147         }
    148         BFS(1);
    149         q = INT();
    150         while (q--) {
    151             x = INT(), y = INT();
    152             lct.Update(x, y);
    153         }
    154         for (i = 0; i < n - 2; i++)
    155             printf("%d ", lct.Query(lct.belong[i]));
    156         printf("%d\n", lct.Query(lct.belong[i]));
    157     }
    158     return 0;
    159 }
  • 相关阅读:
    抓老鼠啊~亏了还是赚了?
    币值转换
    打印沙漏
    秋季学习总结
    对我影响最大的三位老师
    自我介绍
    第三周作业
    第二周作业
    求最大值及其下标
    PTA编程总结3
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2652114.html
Copyright © 2011-2022 走看看