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

时间:2022-09-01 15:58:45

题目大意:一棵树,以一定顺序走完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】&lbrack;JLOI2014&rsqb;松鼠的新家 LCA&plus;差分数组

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

  2. bzoj3631 &lbrack;JLOI2014&rsqb;松鼠的新家——树上差分

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

  3. &lbrack;JLOI2014&rsqb; 松鼠的新家 &lpar;lca&sol;树上差分&rpar;

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

  4. P3258&lbrack;JLOI2014&rsqb;松鼠的新家&lpar;LCA 树上差分&rpar;

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

  5. &lbrack;Bzoj3631&rsqb;&lbrack;JLOI2014&rsqb;松鼠的新家 (树上前缀和)

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

  6. &lbrack;BZOJ3631&rsqb;&colon;&lbrack;JLOI2014&rsqb;松鼠的新家(LCA&plus;树上差分)

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

  7. BZOJ3631 &lbrack;JLOI2014&rsqb;松鼠的新家 【树上差分】

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

  8. BZOJ 3631&colon; &lbrack;JLOI2014&rsqb;松鼠的新家 树上差分 &plus; LCA

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

  9. bzoj3631&lbrack;JLOI2014 松鼠的新家 倍增lca&plus;差分

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

随机推荐

  1. Oracle函数组的使用

    --1.组函数--COUNT():用来统计记录的条数 如果没有记录,返回 0--COUNT函数可以根据一列或多列进行计算,没有排重功能--统计EMP表一共有多少条记录select count(empn ...

  2. LINUX 2&period;6&period;18-238 local root exp

    /* * * * 1-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=0 * 0 _ __ __ __ 1 * ...

  3. &lbrack;BS-23&rsqb; AFN网络请求上拉&sol;下拉刷新的细节问题总结

    上拉/下拉刷新的细节问题总结 1.如果导航栏有透明色,则也需要设置header自动改变透明度 self.tableView.mj_header.automaticallyChangeAlpha = Y ...

  4. CSS&lowbar;03&lowbar;03&lowbar;ul图片替换

    ul图片替换 第01步:编写css样式:url.css @charset "utf-8"; /*ul用图片替换*/ ul.u_01{/*图片*/ list-style:circle ...

  5. python3 多线程的基本用法

    #coding=utf-8 import threading #导入threading包 from time import sleep import time   def task1():     p ...

  6. ASP&period;NET MVC5总结(四)登陆中常用技术解析之验证码

    在应用软件中,登陆系统我们往往会用到验证码技术,下面将介绍在MVC中用到的验证码技术. 1.前端代码段及前端效果图如下 <div class="row"> <in ...

  7. Linux &amp&semi;&amp&semi; vim 批量替换

    Linux批量文件的字符串替换 sed -i "s/oldstring/newstring/g" `grep oldstring -rl path` vim多行替换::1,2s/s ...

  8. PreTranslateMessage和TranslateMessage区别&lpar;转&rpar;

    PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. ...

  9. MySql学习笔记&lpar;一&rpar; —— 关键字的使用

    1.distinct关键字 作用:检索出有不同值的列,比如一个商品表中存在供应商vend_id,一个供应商会对应很多商品,我们要查找有多少供应商,就可以用到该关键字去重. select distinc ...

  10. mysql 查询 练习题及答案

    CREATE DATABASE school;USE school;/*1.创建student表格*//*id为主键 非空 唯一 */CREATE TABLE student (id INT(10) ...