【LG3233】[HNOI2014]世界树
题面
题解

代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int MAX_N = 3e5 + 5;
struct Graph { int to, next; } e[MAX_N << 1]; int fir[MAX_N], e_cnt;
void clearGraph() { memset(fir, -1, sizeof(fir)); e_cnt = 0; }
void Add_Edge(int u, int v) { e[e_cnt] = (Graph){v, fir[u]}, fir[u] = e_cnt++; }
int bin[20];
int N, M, dfn;
int fa[MAX_N][20], dep[MAX_N], id[MAX_N], size[MAX_N];
int a[MAX_N], b[MAX_N], f[MAX_N];
int top, stk[MAX_N], c[MAX_N];
int rem[MAX_N], bel[MAX_N];
bool cmp(int a, int b) { return id[a] < id[b]; }
void dfs(int x, int f) {
id[x] = ++dfn;
size[x] = 1;
for (int i = 1; bin[i] <= dep[x]; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
for (int i = fir[x]; ~i; i = e[i].next)
if (e[i].to != f) {
fa[e[i].to][0] = x;
dep[e[i].to] = dep[x] + 1;
dfs(e[i].to, x);
size[x] += size[e[i].to];
}
}
int LCA(int x, int y) {
if (dep[x] > dep[y]) swap(x, y);
int t = dep[y] - dep[x];
for (int i = 0; bin[i] <= t; i++)
if (bin[i] & t) y = fa[y][i];
for (int i = 18; i >= 0; i--)
if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
return x == y ? x : fa[x][0];
}
int dis(int a, int b) { return dep[a] + dep[b] - 2 * dep[LCA(a, b)]; }
void solve(int a, int b) {
int x = b, mid = b;
for (int i = 18; i >= 0; i--)
if (dep[fa[x][i]] > dep[a]) x = fa[x][i];
rem[a] -= size[x];
if (bel[a] == bel[b]) {
f[bel[a]] += size[x] - size[b];
return ;
}
for (int i = 18; i >= 0; i--) {
int nxt = fa[mid][i]; if (dep[nxt] <= dep[a]) continue;
int t1 = dis(bel[a], nxt), t2 = dis(bel[b], nxt);
if (t1 > t2 || (t1 == t2 && bel[b] < bel[a])) mid = nxt;
}
f[bel[a]] += size[x] - size[mid];
f[bel[b]] += size[mid] - size[b];
}
void dfs1(int x) {
c[++dfn] = x, rem[x] = size[x];
for (int i = fir[x]; ~i; i = e[i].next) {
dfs1(e[i].to); if (!bel[e[i].to]) continue;
int t1 = dis(bel[e[i].to], x), t2 = dis(bel[x], x);
if ((t1 == t2 && bel[e[i].to] < bel[x]) || t1 < t2 || !bel[x])
bel[x] = bel[e[i].to];
}
}
void dfs2(int x) {
for (int i = fir[x]; ~i; i = e[i].next) {
int t1 = dis(bel[x], e[i].to), t2 = dis(bel[e[i].to], e[i].to);
if ((t1 == t2 && bel[e[i].to] > bel[x]) || t1 < t2 || !bel[e[i].to])
bel[e[i].to] = bel[x];
dfs2(e[i].to);
}
}
void solve() {
top = dfn = e_cnt = 0;
M = gi();
for (int i = 1; i <= M; i++) a[i] = b[i] = gi();
for (int i = 1; i <= M; i++) bel[a[i]] = a[i];
sort(&a[1], &a[M + 1], cmp);
if (bel[1] != 1) stk[++top] = 1;
for (int i = 1; i <= M; i++) {
int t = a[i], f = 0;
while (top > 0) {
f = LCA(stk[top], t);
if (top > 1 && dep[f] < dep[stk[top - 1]])
Add_Edge(stk[top - 1], stk[top]), top--;
else if (dep[f] < dep[stk[top]]) {
Add_Edge(f, stk[top]); top--;
break;
} else break;
}
if (stk[top] != f) stk[++top] = f;
stk[++top] = t;
}
while (top > 1) Add_Edge(stk[top - 1], stk[top]), top--;
dfs1(1), dfs2(1);
for (int i = 1; i <= dfn; i++)
for (int j = fir[c[i]]; ~j; j = e[j].next) solve(c[i], e[j].to);
for (int i = 1; i <= dfn; i++) f[bel[c[i]]] += rem[c[i]];
for (int i = 1; i <= M; i++) printf("%d ", f[b[i]]);
puts("");
for (int i = 1; i <= dfn; i++) f[c[i]] = bel[c[i]] = rem[c[i]] = 0, fir[c[i]] = -1;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("cpp.in", "r", stdin);
#endif
clearGraph();
bin[0] = 1;
for (int i = 1; i < 20; i++) bin[i] = bin[i - 1] << 1;
N = gi();
for (int i = 1; i < N; i++) {
int u = gi(), v = gi();
Add_Edge(u, v);
Add_Edge(v, u);
}
dfs(1, 0);
clearGraph();
int Q = gi();
while (Q--) solve();
return 0;
}
【LG3233】[HNOI2014]世界树的更多相关文章
- [BZOJ3572][Hnoi2014]世界树
[BZOJ3572][Hnoi2014]世界树 试题描述 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条 ...
- BZOJ 3572: [Hnoi2014]世界树
BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...
- bzoj 3572: [Hnoi2014]世界树 虚树 && AC500
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 520 Solved: 300[Submit][Status] ...
- bzoj 3572 [Hnoi2014]世界树(虚树+DP)
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 645 Solved: 362[Submit][Status] ...
- 【BZOJ3572】[Hnoi2014]世界树 虚树
[BZOJ3572][Hnoi2014]世界树 Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森 ...
- bzoj3572[Hnoi2014] 世界树 虚树+dp+倍增
[Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1921 Solved: 1019[Submit][Status][Dis ...
- <虚树+树型DP> HNOI2014世界树
<虚树+树型DP> HNOI2014世界树 #include <iostream> #include <cstdio> #include <cstring&g ...
- [题解] [HNOI2014] 世界树
题面 [HNOI2014]世界树 题解 从数据范围很容易看出是个虚树DP(可惜看出来了也还是不会做) 虚树大家应该都会, 不会的话自己去搜吧, 我懒得讲了, 我们在这里只需要考虑如何DP即可 首先我们 ...
- [HNOI2014]世界树
题目描述 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持续运转的根本基 ...
随机推荐
- HTTP 错误 401.0 - Unauthorized 的解决方案
1.安装vs2015后,以前做的项目中Forms身份验证,竟然不能使用了 2.打开当前项目属性,将windows身份验证属性改为启用 3.vs2015生成的mvc项目中,webconfig缺失auth ...
- leetcode231 2的幂 leetcode342 4的幂 leetcode326 3的幂
1.2的幂 正确写法: class Solution { public: bool isPowerOfTwo(int n) { ) return false; )) == ; } }; 错误写法1: ...
- 文件断点上传,html5实现前端,java实现服务器
断点上传能够防止意外情况导致上传一半的文件下次上传时还要从头下载,网上有很多关于断点的实现,这篇文章只是从前到后完整的记录下一个可用的实例,由于生产环境要求不高,而且就是提供给一两个人用,所以我简化了 ...
- Mac OS X文件系统的附加属性@如何彻底删除
有时候在 Mac 系统下读写 NTFS 分区时,会发现一些文件不能打开. 显示错误为: 项目“XXX”已被 OS X 使用,不能打开. 如果再终端 ls -al 命令一下就可以看到: -rwxr-xr ...
- 浅谈chr(239) . chr(187) . chr(191)的作用
chr(239) . chr(187) . chr(191) 作为一名初学者,偶尔在代码中发现这么一段代码: json_decode(trim($param, chr(239) . chr(187) ...
- java 常用类2
1.1 日期时间类 时间戳(timestamp):距离特定时间的时间间隔. 计算机时间戳是指距离历元(1970-01-01 00:00:00:000)的时间间隔(ms). 计算机中时间2019-04- ...
- Lombok安装和使用
前言 Lombok是一个开源项目,其使用简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码,特别是对于POJO. Lombok的官网:https://projectlombok ...
- HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
Portal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- Template Method(模板方法)模式
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序.但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关.例子1: ...
- oAuth2.0认证流程图
这两天在看oAuth2.0的东西,简单的使用visio画了个流程图.演示的是用户登录慕课网,使用qq登录的流程: