题目大意:一棵树,以一定顺序走完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,所以要减去。

 #include<stdio.h>
 #include<algorithm>
 using namespace std;
 ;
 struct node{
     int to,next;
 }e[maxn*];
 ],w[maxn],f[maxn],tot,logn;

 void insert(int u, int v){
     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
 }

 void dfs(int u, int f, int d){
     dep[u]=d; fa[u][]=f;
     ; i<=logn; i++) fa[u][i]=fa[fa[u][i-]][i-];
     for (int i=head[u]; i; i=e[i].next)
         );
 }

 void lca(int u, int v){
     if (dep[u]<dep[v]) swap(u,v);
     int x=u,y=v;
     while (dep[u]>dep[v]){
         ; i--)
             if (dep[fa[u][i]]>dep[v])
                 u=fa[u][i];
         u=fa[u][];
     }
     if (u==v){  //在某条链上
         w[fa[u][]]--;
         w[x]++;
         return;
     }
     ; i--)  //在分叉口上
         if (fa[u][i]!=fa[v][i]){
             u=fa[u][i];
             v=fa[v][i];
         }
     u=fa[u][];
     w[x]++; w[y]++;
     w[u]--; w[fa[u][]]--;
     return;
 }

 void get_ans(int u){
     f[u]=w[u];// printf("  %d\n", w[u]);
     for (int i=head[u],v; i; i=e[i].next){
         ]) continue;
         get_ans(e[i].to);
         f[u]+=f[v];
     }
 }

 int main(){
     scanf("%d", &n);
     ; i<=n; i++) scanf(; <<logn)<n) logn++;
     ,u,v; i<n; i++) scanf(,a[]);
     dfs(,,);
     ; i<=n; i++){
         lca(a[i-],a[i]);
     }
     get_ans(a[]);
     ; i<=n; i++) printf(])?f[i]:f[i]-);
     ;
 }

bzoj3631: [JLOI2014]松鼠的新家(LCA+差分)的更多相关文章

  1. 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...

  2. bzoj3631 [JLOI2014]松鼠的新家——树上差分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3631 树上差分:注意路径的结尾被多算了一次,最后要减去(不能提前减). 代码如下: #inc ...

  3. [JLOI2014] 松鼠的新家 (lca/树上差分)

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

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

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

  5. [Bzoj3631][JLOI2014]松鼠的新家 (树上前缀和)

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2350  Solved: 1212[Submit][Sta ...

  6. [BZOJ3631]:[JLOI2014]松鼠的新家(LCA+树上差分)

    题目传送门 题目描述: 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...

  7. BZOJ3631 [JLOI2014]松鼠的新家 【树上差分】

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

  8. BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA

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

  9. bzoj3631[JLOI2014 松鼠的新家 倍增lca+差分

    裸的树上差分+倍增lca 每次从起点到终点左闭右开,这就有一个小技巧,要找到右端点向左端点走的第一步,然后差分就好了 #include<cstdio> #include<cstrin ...

随机推荐

  1. 高德地图纯js和html

    <!doctype html> <html> <head> <meta content="" charset="utf-8&qu ...

  2. docker--初体验

    docker这个词已经越来越热,很多docker的概念是从周围人和知乎上看的,打算从功能上先了解docker,深入的话放在以后. ps:正好手头有一台腾讯云的vps,单核,1G内存,可以拿来做实验,腾 ...

  3. MySqlNDB使用自带的ndb_setup.py安装集群

    在用Mysql做集群时,使用Mysql的NDB版本更易于集群的扩展,稳定和数据的实时性. 我们可以使用Mysql自带的工具进行集群安装与管理:ndb_setup.py.位于Mysql的安装目录bin下 ...

  4. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  5. 阿里云CentOS7系列三 -- 配置防火墙

    前面讲到了安装JDK以及Tomcat.但是大家会发现,当我们访问 http:// XXX.XXX.XXX.XXX:8080/80 时候,tomcat 猫并没有出现.原因就是没有设置防火墙. 再次介绍下 ...

  6. Js动态设置rem来实现移动端字体的自适应

    //设置根元素字体 var win = window, doc = document; function setFontSize() { var winWidth = $(window).width( ...

  7. 提取postgresql数据库中jsonb列的数据

    ; SELECT t.errmsg,sms_records.* FROM sms_records, jsonb_to_record(result_json) AS t(errmsg text,sid ...

  8. 【leetcode】Add Binary

    题目简述: Given two binary strings, return their sum (also a binary string). For example, a = "11&q ...

  9. Error:Execution failed for task ':clean'. > Unable to delete directory :\build\intermediates (转)

    第一种方法: build文件夹,可以使用360文件粉碎机删除,然后重启Android Studio即可! 转自 第二种方法: 进入studio,进入settings,搜索instant run,进入该 ...

  10. IBatis.Net使用总结(四)-- IBatis 调用存储过程

    IBatis 调用存储过程 http://www.cnblogs.com/jeffwongishandsome/archive/2010/01/10/1543219.html http://www.c ...