4539: [Hnoi2016]树

链接

分析:

  主席树+倍增。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
#define pa pair<int,int>
using namespace std;
typedef long long LL;
#define int LL
inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
struct Edge { int to, nxt; } e[N << ];
struct OPT { int l, r, fa, rt; } q[N];
int head[N], dfn[N], st[N], ed[N], pos[N], fa[N][], siz[N], f[N][], g[N][], d1[N], d2[N];
set< pa > s;
int En, Index, NowIndex, n; inline void add_edge(int u,int v) {
++En; e[En].to = v, e[En].nxt = head[u]; head[u] = En;
++En; e[En].to = u, e[En].nxt = head[v]; head[v] = En;
}
struct SegmentTree{
int sum[N * ], ls[N * ], rs[N * ], Root[N], TreeIndex;
void Insert(int l,int r,int &now,int pre,int p) {
if (!now) now = ++TreeIndex;
sum[now] = sum[pre] + ;
if (l == r) return ;
int mid = (l + r) >> ;
if (p <= mid) {
rs[now] = rs[pre];
Insert(l, mid, ls[now], ls[pre], p);
} else {
ls[now] = ls[pre];
Insert(mid + , r, rs[now], rs[pre], p);
}
}
int query(int l,int r,int H,int T,int k) {
if (l == r) return l;
int mid = (l + r) >> ;
if (k <= sum[ls[T]] - sum[ls[H]]) return query(l, mid, ls[H], ls[T], k);
else return query(mid + , r, rs[H], rs[T], k - (sum[ls[T]] - sum[ls[H]]));
}
}T;
void dfs(int u) {
d1[u] = d1[fa[u][]] + ;
st[u] = ++Index; pos[Index] = u; siz[u] = ;
for (int i = ; i <= ; ++i) fa[u][i] = fa[fa[u][i - ]][i - ];
for (int i = head[u]; i; i = e[i].nxt) {
int v = e[i].to;
if (v == fa[u][]) continue;
fa[v][] = u;
dfs(v);
siz[u] += siz[v];
}
ed[u] = Index;
}
int LCA1(int u,int v) {
if (d1[u] < d1[v]) swap(u, v);
int d = d1[u] - d1[v];
for (int i = ; ~i; --i) if ((d >> i) & ) u = fa[u][i];
if (u == v) return u;
for (int i = ; ~i; --i) if (fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
return fa[u][];
}
int getdis(int x,int y) {
return d1[x] + d1[y] - d1[LCA1(x, y)] * ;
}
void add(int id) {
int x = read(), y = read(), z;
q[id].l = NowIndex, q[id].r = (NowIndex += siz[x]) - , q[id].rt = x;
set< pa > :: iterator it = s.lower_bound(pa(y, )); z = q[it->second].rt;
q[id].fa = T.query(, n, T.Root[st[z] - ], T.Root[ed[z]], y - q[it->second].l + );
f[id][] = it->second, g[id][] = getdis(q[id].fa, z) + ;
d2[id] = d2[it->second] + ;
for (int i = ; i <= ; ++i) f[id][i] = f[f[id][i - ]][i - ], g[id][i] = g[id][i - ] + g[f[id][i - ]][i - ];
s.insert(pa(q[id].r, id));
}
int LCA2(int u,int v,int tu,int tv) {
if (d2[u] < d2[v]) swap(u, v), swap(tu, tv);
int ans = , t = u, d = d2[u] - d2[v];
for (int i = ; ~i; --i) if ((d >> i) & ) ans += g[u][i], u = f[u][i];
if (u == v) {
d --; ans = ; u = t;
for (int i = ; ~i; --i) if ((d >> i) & ) ans += g[t][i], t = f[t][i];
ans += getdis(q[t].fa, tv) + + getdis(tu, q[u].rt);
return ans;
}
ans += getdis(tu, q[t].rt) + getdis(tv, q[v].rt);
for (int i = ; ~i; --i) if (f[u][i] != f[v][i]) ans += g[u][i] + g[v][i], u = f[u][i], v = f[v][i];
ans += getdis(q[u].fa, q[v].fa) + ;
return ans;
}
void Ask() {
int u = read(), v = read(), ans, iu, iv, tu, tv;
iu = s.lower_bound(pa(u, ))->second, iv = s.lower_bound(pa(v, ))->second;
tu = T.query(, n, T.Root[st[q[iu].rt] - ], T.Root[ed[q[iu].rt]], u - q[iu].l + );
tv = T.query(, n, T.Root[st[q[iv].rt] - ], T.Root[ed[q[iv].rt]], v - q[iv].l + );
if (iu != iv) ans = LCA2(iu, iv, tu, tv);
else ans = getdis(tu, tv);
printf("%lld\n", ans);
}
signed main() {
n = read();int m = read(), Q = read();
for (int i = ; i < n; ++i) add_edge(read(), read());
dfs();
for (int i = ; i <= n; ++i)
T.Insert(, n, T.Root[i], T.Root[i - ], pos[i]);
NowIndex = n + ;
s.insert(pa(n, )); q[].l = , q[].r = n, q[].rt = , q[].fa = ;
for (int i = ; i <= m; ++i) add(i + );
while (Q --) Ask();
return ;
}

4539: [Hnoi2016]树的更多相关文章

  1. BZOJ 4539: [Hnoi2016]树 [主席树 lca]

    4539: [Hnoi2016]树 题意:不想写.复制模板树的子树,查询两点间距离. *** 终于有一道会做的题了...... 画一画发现可以把每次复制的子树看成一个大点来建一棵树,两点的lca一定在 ...

  2. bzoj 4539 [Hnoi2016]树——主席树+倍增

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4539 明明就是把每次复制的一个子树当作一个点,这样能连出一个树的结构,自己竟然都没想到.思维 ...

  3. bzoj 4539: [Hnoi2016]树

    Description 小A想做一棵很大的树,但是他手上的材料有限,只好用点小技巧了.开始,小A只有一棵结点数为N的树,结 点的编号为1,2,-,N,其中结点1为根:我们称这颗树为模板树.小A决定通过 ...

  4. [BZOJ4539][HNOI2016]树(主席树)

    4539: [Hnoi2016]树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 746  Solved: 292[Submit][Status][D ...

  5. 【LG3248】[HNOI2016]树

    [LG3248][HNOI2016]树 题面 洛谷 题解 因为每次你加入的点是原树上某一棵子树 那么我们一次加入一个点,代表一棵子树加到大树下面 那么我们要找到一个点在一个大点中用主席树在\(dfs\ ...

  6. [HNOI2016]树(可持久化线段树+树上倍增)

    [HNOI2016]树(可持久化线段树+树上倍增) 题面 给出一棵n个点的模板树和大树,根为1,初始的时候大树和模板树相同.接下来操作m次,每次从模板树里取出一棵子树,把它作为新树里节点y的儿子.操作 ...

  7. BZOJ4539: [Hnoi2016]树

    复制的树缩点,主席树查k小,毫无技术含量,纯码农题. #include<bits/stdc++.h> #define u first #define v second #define F ...

  8. [HNOI2016]树

    Description 小A想做一棵很大的树,但是他手上的材料有限,只好用点小技巧了.开始,小A只有一棵结点数为N的树,结 点的编号为1,2,…,N,其中结点1为根:我们称这颗树为模板树.小A决定通过 ...

  9. 2019.03.25 bzoj4539: [Hnoi2016]树(主席树+倍增)

    传送门 题意:给一棵大树,令一棵模板树与这棵树相同,然后进行mmm次操作,每次选择模板树中的一个节点aaa和大树中一个节点bbb,把aaa这棵子树接在bbb上面,节点编号顺序跟aaa中的编号顺序相同. ...

随机推荐

  1. python文本文件处理和用户输入

    #用户输入 a = input('please input: ') #这个输入什么即是什么,比如输入1,则a变量=1,输入'abc',则a变量 = 'abc',输入abc则报错,因为会把abc当做一个 ...

  2. iOS设计模式 - 生成器

    iOS设计模式 - 生成器 原理图 说明 1. 将构建复杂对象的过程拆分成一个一个的模块,通过统一的指导者来指导对象的构建过程称之为生成器模式 2. 生成器模式适合用于构建组合的对象 源码 https ...

  3. 教你使用Paw解析http请求

    教你使用Paw解析http请求 软件下载地址: 链接: http://pan.baidu.com/s/1gdzmjq7 密码: 3mpb 这款应用的图片像极了百度,哈哈. 支持的请求方式: 完整的显示 ...

  4. django使用LDAP验证

    1.安装Python-LDAP(python_ldap-2.4.25-cp27-none-win_amd64.whl)pip install python_ldap-2.4.25-cp27-none- ...

  5. ms17-010漏洞利用教程

    ms17-010 漏洞利用并拿下服务器教程 攻击环境: 攻击机win2003 ip:192.168.150.129 Window2003 Python环境及工具 攻击机kali: ip:192.168 ...

  6. November 29th 2016 Week 49th Tuesday

    It is not easy to meet each other in such a big world. 世界这么大,能遇见,不容易. To meet each other, to make ne ...

  7. November 13th 2016 Week 47th Sunday The 1st Day

    Adventure may hurt you, but monotony will kill you. 也许冒险会让你受伤,但一成不变会让你灭亡. Just change a bit, let the ...

  8. November 9th 2016 Week 46th Wednesday

    Love is the poetry of the scenes. 爱是感官之诗. Recently I always feel lonely, I badly hope that I can fin ...

  9. Centos7使用yum安装Mysql5.7.19的详细步骤(可用)

    Centos7的yum源中默认是没有mysql,因为现在已经用mariaDB代替mysql了. 首先我们下载mysql的repo源,我们可以去mysql官网找最新的repo源地址 地址: https: ...

  10. 20145203盖泽双:Java实验报告二

    Java实验报告二:Java面向对象程序设计 实验要求: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验内容 ...