传送门

比着题解写还错。。。

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

以后再查

——代码(WA)

 #include <cstdio>
#include <cstring>
#include <iostream>
#define N 2000001
#define Min(x, y) ((x) < (y) ? (x) : (y))
#define Max(x, y) ((x) > (y) ? (x) : (y))
#define swap(x, y) ((x) ^= (y) ^= (x) ^= (y)) int n, m, cnt, qcnt, acnt;
int f[N], fa[N], max[N], min[N], up[N], down[N], ans[N];
int head[N], to[N << ], next[N << ], qhead[N], qu[N << ], qv[N << ], qid[N << ], qnext[N << ], ahead[N], ato[N << ], anext[N << ]; inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline void add(int x, int y)
{
to[cnt] = y;
next[cnt] = head[x];
head[x] = cnt++;
} inline void add_ask(int x, int y, int z)
{
qu[qcnt] = x;
qv[qcnt] = y;
qid[qcnt] = z;
qnext[qcnt] = qhead[x];
qhead[x] = qcnt++;
} inline void add_ans(int x, int y)
{
ato[acnt] = y;
anext[acnt] = ahead[x];
ahead[x] = acnt++;
} inline int find(int x)
{
if(x ^ f[x])
{
int fx = f[x];
f[x] = find(f[x]);
up[x] = Max(up[x], Max(up[fx], max[fx] - min[x]));
down[x] = Max(down[x], Max(down[fx], max[x] - min[fx]));
max[x] = Max(max[fx], max[x]);
min[x] = Min(min[fx], max[x]);
}
return f[x];
} inline void dfs(int u)
{
int i, v, x, y;
f[u] = u;
for(i = qhead[u]; i ^ -; i = qnext[i])
if(f[qv[i]])
{
x = find(qv[i]);
add_ans(x, i);
}
for(i = head[u]; i ^ -; i = next[i])
{
v = to[i];
if(v ^ fa[u]) fa[v] = u, dfs(v);
}
for(i = ahead[u]; i ^ -; i = anext[i])
{
x = qu[ato[i]];
y = qv[ato[i]];
find(x), find(y);
if(ato[i] & ) swap(x, y);
ans[qid[ato[i]]] = Max(max[y] - min[x], Max(up[x], down[y]));
}
f[u] = fa[u];
} int main()
{
int i, j, x, y;
while(~scanf("%d", &n))
{
cnt = qcnt = acnt = ;
memset(head, -, sizeof(head));
memset(qhead, -, sizeof(qhead));
memset(ahead, -, sizeof(ahead));
memset(f, , sizeof(f));
memset(fa, , sizeof(fa));
memset(ans, , sizeof(ans));
for(i = ; i <= n; i++) min[i] = max[i] = read(), up[i] = down[i] = ;
for(i = ; i < n; i++)
{
x = read();
y = read();
add(x, y);
add(y, x);
}
m = read();
for(i = ; i <= m; i++)
{
x = read();
y = read();
add_ask(x, y, i);
add_ask(y, x, i);
}
dfs();
for(i = ; i <= m; i++) printf("%d\n", ans[i]);
}
return ;
}

最新文章

  1. SASS 初学者入门
  2. 转载--JAVA读取文件最佳实践
  3. Java读数据是的编码问题。
  4. codevs 1088 神经网络
  5. 1206: [HNOI2005]虚拟内存 - BZOJ
  6. Android中的动画
  7. 神经网络作业: NN LEARNING Coursera Machine Learning(Andrew Ng) WEEK 5
  8. 在magento中定义static block
  9. JAVA实用案例之验证码开发
  10. bzoj1968 COMMON 约数研究
  11. 使用LINQ TO XML 创建xml文档,以及读取xml文档把内容显示到GridView例子
  12. C#2.0 迭代器
  13. Faster R-CNN:详解目标检测的实现过程
  14. javascript的严格模式和正常模式
  15. Linux下更新Git
  16. 一文读懂遗传算法工作原理(附Python实现)
  17. Atcoder 1973:こだわり者いろはちゃん / Iroha's Obsession
  18. [ios][swift]文本框UITextField用法
  19. web.py模版系统
  20. “全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程

热门文章

  1. [VC]listctrl的基本用法
  2. HDU - 5457 Hold Your Hand (Trie + 最小割)
  3. [论文理解]SSD:Single Shot MultiBox Detector
  4. Jquery库插件大全(工作中遇到总结)
  5. 分类回归树(CART)
  6. MFC多文档无法显示可停靠窗格
  7. docker-企业级镜像仓库harbor
  8. 访问URI地址
  9. Java制作桌面弹球下载版 使用如鹏游戏引擎制作 包含2个精灵球同时弹动
  10. javascript (六)DOM