• [POJ3728]The merchant(tanrjan_lca + DP)


    传送门

    比着题解写还错。。。

    查了两个小时没查出来,心态爆炸啊

    以后再查

    ——代码(WA)

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <iostream>
      4 #define N 2000001
      5 #define Min(x, y) ((x) < (y) ? (x) : (y))
      6 #define Max(x, y) ((x) > (y) ? (x) : (y))
      7 #define swap(x, y) ((x) ^= (y) ^= (x) ^= (y))
      8 
      9 int n, m, cnt, qcnt, acnt;
     10 int f[N], fa[N], max[N], min[N], up[N], down[N], ans[N];
     11 int head[N], to[N << 1], next[N << 1], qhead[N], qu[N << 1], qv[N << 1], qid[N << 1], qnext[N << 1], ahead[N], ato[N << 1], anext[N << 1];
     12 
     13 inline int read()
     14 {
     15     int x = 0, f = 1;
     16     char ch = getchar();
     17     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
     18     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
     19     return x * f;
     20 }
     21 
     22 inline void add(int x, int y)
     23 {
     24     to[cnt] = y;
     25     next[cnt] = head[x];
     26     head[x] = cnt++;
     27 }
     28 
     29 inline void add_ask(int x, int y, int z)
     30 {
     31     qu[qcnt] = x;
     32     qv[qcnt] = y;
     33     qid[qcnt] = z;
     34     qnext[qcnt] = qhead[x];
     35     qhead[x] = qcnt++;
     36 }
     37 
     38 inline void add_ans(int x, int y)
     39 {
     40     ato[acnt] = y;
     41     anext[acnt] = ahead[x];
     42     ahead[x] = acnt++;
     43 }
     44 
     45 inline int find(int x)
     46 {
     47     if(x ^ f[x])
     48     {
     49         int fx = f[x];
     50         f[x] = find(f[x]);
     51         up[x] = Max(up[x], Max(up[fx], max[fx] - min[x]));
     52         down[x] = Max(down[x], Max(down[fx], max[x] - min[fx]));
     53         max[x] = Max(max[fx], max[x]);
     54         min[x] = Min(min[fx], max[x]);
     55     }
     56     return f[x];
     57 }
     58 
     59 inline void dfs(int u)
     60 {
     61     int i, v, x, y;
     62     f[u] = u;
     63     for(i = qhead[u]; i ^ -1; i = qnext[i])
     64         if(f[qv[i]])
     65         {
     66             x = find(qv[i]);
     67             add_ans(x, i);
     68         }
     69     for(i = head[u]; i ^ -1; i = next[i])
     70     {
     71         v = to[i];
     72         if(v ^ fa[u]) fa[v] = u, dfs(v);
     73     }
     74     for(i = ahead[u]; i ^ -1; i = anext[i])
     75     {
     76         x = qu[ato[i]];
     77         y = qv[ato[i]];
     78         find(x), find(y);
     79         if(ato[i] & 1) swap(x, y);
     80         ans[qid[ato[i]]] = Max(max[y] - min[x], Max(up[x], down[y]));
     81     }
     82     f[u] = fa[u];
     83 }
     84 
     85 int main()
     86 {
     87     int i, j, x, y;
     88     while(~scanf("%d", &n))
     89     {
     90         cnt = qcnt = acnt = 0;
     91         memset(head, -1, sizeof(head));
     92         memset(qhead, -1, sizeof(qhead));
     93         memset(ahead, -1, sizeof(ahead));
     94         memset(f, 0, sizeof(f));
     95         memset(fa, 0, sizeof(fa));
     96         memset(ans, 0, sizeof(ans));
     97         for(i = 1; i <= n; i++) min[i] = max[i] = read(), up[i] = down[i] = 0;
     98         for(i = 1; i < n; i++)
     99         {
    100             x = read();
    101             y = read();
    102             add(x, y);
    103             add(y, x);
    104         }
    105         m = read();
    106         for(i = 1; i <= m; i++)
    107         {
    108             x = read();
    109             y = read();
    110             add_ask(x, y, i);
    111             add_ask(y, x, i);
    112         }
    113         dfs(1);
    114         for(i = 1; i <= m; i++) printf("%d
    ", ans[i]);
    115     }
    116     return 0;
    117 }
    View Code
  • 相关阅读:
    JZOJ 5870 地图
    20190921
    20190919
    SP703 SERVICE
    UVA323 Jury Compromise
    [note]一类位运算求最值问题
    [BZOJ3674]可持久化并查集
    [luogu3359]改造异或树
    [luogu4755]Beautiful Pair
    [BJWC2012]冻结
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/7026086.html
Copyright © 2020-2023  润新知