题面

题解

  这种题目一看就是重链剖分裸题,还是区间修改,单点查询,查询之前在遍历时要记一个$delta$,因为这一次的起点就是上一次的终点,不需要放糖,所以可以用$BIT$来写,但我写完$modify$才反应过来,所以没改了。

#include <cstdio>
#include <cstring>
#include <algorithm>
using std::swap; const int N = 3e5 + 10;
int n, a[N], siz[N], son[N], fa[N], dep[N];
int tim, dfn[N], top[N], delta[N];
int cnt, from[N], to[N << 1], nxt[N << 1];
int val[N << 2], add[N << 2];
inline void addEdge(int u, int v) {
to[++cnt] = v, nxt[cnt] = from[u], from[u] = cnt;
} void dfs(int u) {
siz[u] = 1, dep[u] = dep[fa[u]] + 1;
for(int i = from[u]; i; i = nxt[i]) {
int v = to[i]; if(v == fa[u]) continue;
fa[v] = u, dfs(v), siz[u] += siz[v];
if(siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs(int u, int t) {
dfn[u] = ++tim, top[u] = t;
if(!son[u]) return ; dfs(son[u], t);
for(int i = from[u]; i; i = nxt[i]) {
int v = to[i];
if(v != fa[u] && v != son[u]) dfs(v, v);
}
} inline void pushup (int o, int lc, int rc) { val[o] = val[lc] + val[rc]; }
inline void pushdown (int o, int lc, int rc, int len) {
if(add[o]) {
val[lc] += add[o] * (len - (len >> 1));
val[rc] += add[o] * (len >> 1);
add[lc] += add[o], add[rc] += add[o], add[o] = 0;
}
}
void modify (int ml, int mr, int k, int o = 1, int l = 1, int r = n) {
if(l >= ml && r <= mr) { val[o] += k * (r - l + 1), add[o] += k; return ; }
int mid = (l + r) >> 1, lc = o << 1, rc = lc | 1;
pushdown(o, lc, rc, r - l + 1);
if(ml <= mid) modify(ml, mr, k, lc, l, mid);
if(mr > mid) modify(ml, mr, k, rc, mid + 1, r);
pushup(o, lc, rc);
}
int query(int qs, int o = 1, int l = 1, int r = n) {
if(l == r && l == qs) return val[o];
int mid = (l + r) >> 1, lc = o << 1, rc = lc | 1;
pushdown(o, lc, rc, r - l + 1);
if(qs <= mid) return query(qs, lc, l, mid);
else return query(qs, rc, mid + 1, r);
} inline void Path(int x, int y) {
int fx = top[x], fy = top[y];
while(fx != fy) {
if(dep[fx] >= dep[fy]) modify(dfn[fx], dfn[x], 1), x = fa[fx], fx = top[x];
else modify(dfn[fy], dfn[y], 1), y = fa[fy], fy = top[y];
} if(dfn[x] > dfn[y]) swap(x, y); modify(dfn[x], dfn[y], 1);
} int main () {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", a + i);
for(int i = 1, u, v; i < n; ++i) {
scanf("%d%d", &u, &v);
addEdge(u, v), addEdge(v, u);
}
dfs(1), dfs(1, 1);
for(int i = 2; i <= n; ++i)
Path(a[i - 1], a[i]), ++delta[a[i]];
for(int i = 1; i <= n; ++i)
printf("%d\n", query(dfn[i]) - delta[i]);
return 0;
}

Luogu P3258 松鼠的新家(树链剖分+线段树/树状数组)的更多相关文章

  1. B20J_3231_[SDOI2014]旅行_树链剖分+线段树

    B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...

  2. LightOJ 1348 (树链剖分 + 线段树(树状数组))

    题目 Link 分析 典型的树链剖分题, 树链剖分学习资料 Code #include <bits/stdc++.h> using namespace std; const int max ...

  3. Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组

    Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...

  4. jzoj4918. 【GDOI2017模拟12.9】最近公共祖先 (树链剖分+线段树)

    题面 题解 首先,点变黑的过程是不可逆的,黑化了就再也洗不白了 其次,对于\(v\)的祖先\(rt\),\(rt\)能用来更新答案当且仅当\(sz_{rt}>sz_{x}\),其中\(sz\)表 ...

  5. 【bzoj2238】Mst 最小生成树+树链剖分+线段树

    题目描述 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影响,即被删掉的边在下一条询问中依然存在) 输入 第一行两 ...

  6. Water Tree CodeForces 343D 树链剖分+线段树

    Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...

  7. 洛谷P3313 [SDOI2014]旅行 题解 树链剖分+线段树动态开点

    题目链接:https://www.luogu.org/problem/P3313 这道题目就是树链剖分+线段树动态开点. 然后做这道题目之前我们先来看一道不考虑树链剖分之后完全相同的线段树动态开点的题 ...

  8. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  9. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

随机推荐

  1. 数据结构:Bitset

    这个东西看起来很棒棒的样子呀 bitset存储二进制数位 bitset就像一个bool类型的数组一样 bitset中的每个元素都能单独被访问 整数类型和布尔数组都能转化成bitset 有关Bitset ...

  2. 数据结构:二维ST表

    POJ2019 我们其实是很有必要把ST算法拓展到二维的,因为二维的RMQ问题还是不少的 int N,B,K; ]; int val[maxn][maxn]; ][]; ][]; 这里的N是方阵的长宽 ...

  3. Gradle加载本地jar包

    有时,我们需要的jar包不一定能在远程仓库中找到,这时我们需要加载本地的jar包. 加载单独的jar包 在项目底下添加libs目录,将jar包仍进libs目录 build.gradle配置如下: de ...

  4. 重复代码Duplicated Code---要重构的信号

    什么时候需要重构,当你在项目代码里面嗅到这个味道的时候,就要进行重构.   首个介绍的味道是重复代码的味道.   它表现出来的特征是这些:   1.一个类里面,两个函数中,含有相同的代码,类似的代码: ...

  5. 启动Eclipse时,弹出failed to load the jni shared library

    JDK版本和Eclipse版本不同的问题,JDK版本为64位,Eclipse版本为32位.

  6. devm_xxx机制

    前言 devm是内核提供的基础机制,用于方便驱动开发者所分配资源的自动回收.参考内核文档devres.txt.总的来说,就是驱动开发者只需要调用这类接口分配期望的资源,不用关心释放问题.这些资源的释放 ...

  7. 自动化测试===Macaca环境搭建和说明书

    https://www.cnblogs.com/tim2016/p/6400326.html http://www.cnblogs.com/fnng/p/5873878.html https://ww ...

  8. [New learn] 设计模式思考

    本文是对上文[New learn] 设计模式的思考总结 1.大框架 无论应用使用多少种设计模式和技巧,此模式都是应用的大框架.下图为本项目的基本架构图: 1.上图中大框架为经典的MVC模式. 2.Co ...

  9. FineReport——JS二次开发(自定义翻页按钮)

    FR允许自定义工具栏上面的按钮,并提交JS方法: 对于翻页功能,大概有首页,下一页,上一页,最后一页,以及跳转页等功能. 不得不说的是,在HTML页面自定义的按钮如何获取到报表模板,通过FR提供的JS ...

  10. 502 bad gateway,ngix

    1.ftm对nginx的解析出现问题:20171228