EntropyIncreaser

幻想乡大作战 [unfinished]

Apr 5th, 2018
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include <cstdio>
  2.  
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. const int N = 100010;
  10.  
  11. struct Edge {
  12.     int v, w;
  13.     Edge* next;
  14. };
  15.  
  16. int n, m, ql, qr, etotal, root;
  17. int que[N], sum[N], mex[N], prt[N], emex[N], esum[N];
  18. bool vis[N], cut[N];
  19. Edge* g[N];
  20.  
  21. void addEdge(int u, int v, int w);
  22. void order(int u, int from);
  23. void bfs(int u);
  24.  
  25. int main() {
  26.     scanf("%d%d", &n, &m);
  27.     for (int rep = 1; rep < n; ++rep) {
  28.         int u, v, w;
  29.         scanf("%d%d%d", &u, &v, &w);
  30.         addEdge(u, v, w);
  31.         addEdge(v, u, w);
  32.     }
  33.  
  34.     memset(vis, 0, sizeof(vis));
  35.     order(1, 0);
  36.     while (m--) {
  37.         int u, e;
  38.         scanf("%d%d", &u, &e);
  39.         etotal += e;
  40.         while (u) {
  41.             esum[u] += e;
  42.             if (prt[u]) {
  43.                 if (esum[emex[prt[u]]] < esum[u])
  44.                     emex[prt[u]] = u;
  45.             }
  46.             u = prt[u];
  47.         }
  48.         u = root;
  49.         ll ans = 0;
  50.         while (emex[u] && esum[emex[u]] * 2 >= etotal) {
  51.             u = emex[u];
  52.         }
  53.     }
  54.     return 0;
  55. }
  56.  
  57. void bfs(int u) {
  58.     que[ql = 0] = u;
  59.     qr = 1;
  60.     while (ql < qr) {
  61.         u = que[ql++];
  62.         vis[u] = true;
  63.         for (Edge* p = g[u]; p; p = p->next)
  64.             if (!vis[p->v] && !cut[p->v])
  65.                 que[qr++] = p->v;
  66.     }
  67. }
  68.  
  69. void order(int u, int from) {
  70.     bfs(u);
  71.     int div = que[qr - 1];
  72.     for (int i = qr - 1; i >= 0; --i) {
  73.         u = que[i];
  74.         vis[u] = false;
  75.         sum[u] = 1;
  76.         mex[u] = 0;
  77.         for (Edge* p = g[u]; p; p = p->next)
  78.             if (!vis[p->v] && !cut[p->v]) {
  79.                 sum[u] += sum[p->v];
  80.                 mex[u] = max(mex[u], sum[p->v]);
  81.             }
  82.         mex[u] = max(mex[u], qr - sum[u]);
  83.         if (mex[u] < mex[div])
  84.             div = u;
  85.     }
  86.     cut[div] = true;
  87.     prt[div] = from;
  88.     if (from == 0)
  89.         root = div;
  90.     for (Edge* p = g[div]; p; p = p->next)
  91.         if (!cut[p->v])
  92.             order(p->v, div);
  93. }
  94.  
  95. void addEdge(int u, int v, int w) {
  96.     static Edge pool[N * 2];
  97.     static Edge* p = pool;
  98.     p->v = v;
  99.     p->w = w;
  100.     p->next = g[u];
  101.     g[u] = p;
  102.     ++p;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment