题目大意:一棵树,以一定顺序走完n个点,求每个点经过多少遍

可以树链剖分,也可以直接在树上做差分序列的标记

后者打起来更舒适一点。。

具体实现:

先求x,y的lca,且dep[x]<dep[y],

如果在一棵子树下的一条链上,那么lca就是x

则g[fa[x]]--; g[y]++;

如果在一棵子树的两条分枝上,那么lca设为z

g[x]++, g[y]++, g[z]--, g[fa[z]]--

最后从叶子节点加回根节点,加法是差分序列的那种加法

因为z会加左右两边,多加了1,所以要减去。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn = 300010;
 5 struct node{
 6     int to,next;
 7 }e[maxn*2];
 8 int n,a[maxn],head[maxn],dep[maxn],fa[maxn][20],w[maxn],f[maxn],tot,logn;
 9
10 void insert(int u, int v){
11     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
12 }
13
14 void dfs(int u, int f, int d){
15     dep[u]=d; fa[u][0]=f;
16     for (int i=1; i<=logn; i++) fa[u][i]=fa[fa[u][i-1]][i-1];
17     for (int i=head[u]; i; i=e[i].next)
18         if (e[i].to!=f) dfs(e[i].to,u,d+1);
19 }
20
21 void lca(int u, int v){
22     if (dep[u]<dep[v]) swap(u,v);
23     int x=u,y=v;
24     while (dep[u]>dep[v]){
25         for (int i=logn; i>=0; i--)
26             if (dep[fa[u][i]]>dep[v])
27                 u=fa[u][i];
28         u=fa[u][0];
29     }
30     if (u==v){  //在某条链上
31         w[fa[u][0]]--;
32         w[x]++;
33         return;
34     }
35     for (int i=logn; i>=0; i--)  //在分叉口上
36         if (fa[u][i]!=fa[v][i]){
37             u=fa[u][i];
38             v=fa[v][i];
39         }
40     u=fa[u][0];
41     w[x]++; w[y]++;
42     w[u]--; w[fa[u][0]]--;
43     return;
44 }
45
46 void get_ans(int u){
47     f[u]=w[u];// printf("  %d\n", w[u]);
48     for (int i=head[u],v; i; i=e[i].next){
49         if ((v=e[i].to)==fa[u][0]) continue;
50         get_ans(e[i].to);
51         f[u]+=f[v];
52     }
53 }
54
55 int main(){
56     scanf("%d", &n);
57     for (int i=1; i<=n; i++) scanf("%d", &a[i]); tot=1; while ((1<<logn)<n) logn++;
58     for (int i=1,u,v; i<n; i++) scanf("%d%d", &u, &v),insert(u,v),insert(v,u); insert(0,a[1]);
59     dfs(0,0,1);
60     for (int i=2; i<=n; i++){
61         lca(a[i-1],a[i]);
62     }
63     get_ans(a[1]);
64     for (int i=1; i<=n; i++) printf("%d\n", (i==a[1])?f[i]:f[i]-1);
65     return 0;
66 }

转载于:https://www.cnblogs.com/mzl120918/p/6072335.html

bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)相关推荐

  1. bzoj3631[JLOI2014]松鼠的新家

    bzoj3631[JLOI2014]松鼠的新家 题意: 给个n点树,再给个节点的游览顺序,每经过一个节点(包括上一个游览的点到下一个游览的点路径上的点)就可以从这个节点拿走一个糖,问所有节点一开始要放 ...

  2. P3258[JLOI2014]松鼠的新家(LCA 树上差分)

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  3. 洛谷 P3258 [JLOI2014]松鼠的新家 树上差分

    缘起 [1]中我们学习了树上差分,并且a了一个裸的点差分. 现在继续树上差分~ 洛谷 P3258 [JLOI2014]松鼠的新家 分析 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房 ...

  4. BZOJ3631 [JLOI2014]松鼠的新家

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树&q ...

  5. [BZOJ3631][JLOI2014]松鼠的新家

    嗯...企图做ZJOI2011,结果一题都不会QAQ.生气的写树剖来了~ 这题暴力的树剖是可以的,但我是在黄学长那找了这题,他好像有个非常妙的做法,现在差不多要去打ball了,之后再学习一下吧. 树剖 ...

  6. bzoj3631: [JLOI2014]松鼠的新家

    容易发现是树剖裸题. 然后毒瘤选手AKC表示好像可以用树上差分+LCA做. 就这样.水题. 诶那你咋没秒切. 妈也看错样例,然后画错图,接着就是理解错题目,最后R成傻逼之时发现我ST表开数组的顺序错了 ...

  7. [BZOJ3631][JLOI2014]松鼠的新家(链剖)

    题目描述 传送门 题解 小傻逼手残 随便写链剖. 代码 #include<iostream> #include<cstring> #include<cstdio> ...

  8. [Luogu 3258] JLOI2014 松鼠的新家

    [Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...

  9. bzoj 3631: [JLOI2014]松鼠的新家(LCA+树上差分)

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2059  Solved: 1030 [Submit][S ...

  10. P3258 [JLOI2014]松鼠的新家

    文章目录 题意: 题解: 树上差分 代码: 树链剖分 代码: P3258 [JLOI2014]松鼠的新家 题意: n个点,n-1条边,给出每个点的拜访顺序,问每个点经过几次(最后一次移动不算拜访) 题 ...

最新文章

  1. 右键点“工作空间”窗口内空白部分,在弹出的菜单上勾选“Docking View / 停靠式”。然后双击程序窗口的窗棱,就是最上面那条蓝色边框
  2. oracle过率乱码,oracle中文乱码问题处理
  3. 视频云下半场 向前走还是向“厚”走?
  4. Vue学习(slot、axios)-学习笔记
  5. JavaScript --- 跨浏览器的事件对象
  6. Virtualbox中win7虚拟机中U盘不可用问题的解决
  7. python shell怎么打开测试,python脚本第一篇,运行时间测试
  8. 雷达图像与电子海图叠加坐标变化优化方法
  9. 智慧城市、智慧工地、平安城市、雪亮工程等监控项目中应用SkeyeVSS国标GB28181流媒体服务
  10. 基于波动率的期权交易策略分析
  11. think-queue使用教程-用户注册场景异步发送邮件
  12. CDAS2016中国数据分析师行业峰会议程(完整版)!
  13. 网站打开缓慢的原因有哪些?
  14. 【概念】区块链中账本是什么?通用区块链平台账本概念介绍,一个谁都能看懂的账本概念
  15. ChinaSoft 论坛巡礼 | 服务生态系统的构建、运维与演化
  16. 2020-08-26 笔记的风格和措辞
  17. 自媒体都在用的5个素材网站,视频、音效、图片全部免费下载~
  18. Samba服务和FTP服务
  19. landesk桌面管理
  20. (八)以交易为生:交易系统

热门文章

  1. 彻底弄明白之数据结构中的排序七大算法-java实现
  2. (转)Android text文字阴影设置
  3. 《转》解决struts2在(IE,Firefox)下载文件名乱码问题。
  4. 待看内容 20160823
  5. Nginx 常用配置,避坑指南!
  6. 面试官:什么是对象池?有什么用?别说你还不会!
  7. 真心干货:一起学习阿里巴巴数据中台实践!首次公开!
  8. WePhone开发者被逼自杀案续,在翟欣欣身上的各种消费清单明细及细节曝光
  9. 代码重构方向原则指导
  10. Andromeda OS 来了,Android 再见?