题目

传送门

题解

看到某Yuta的树总结觉得LCA+树上差分挺好写而且差分没写过准备水一发结果水了一上午qwq。因为第一次写树上差分和树剖求LCA,结果树剖版子某处打错了。。(而且差分点和差分边还是有一定区别的)。


这题可以用树剖水部分分,不过n有30w,log方就会被卡了。所以利用差分思想把区间修改转化为点修改。给每个点一个tag表示新增值(貌似怪怪的)。如果有条路径(i,j)需要标记那么进行如下操作

tag(i)++;tag(j)++;tag(LCA(i,j))- -;tag(father(LCA(i,j)))- -;

这样能够达到标记经过的点的效果,请自行脑补如果是经过的边如何标记。
那么就把路径拆分就好了,但是这道题非起始端点会被多算一次(在衔接处),所以统计完后减回来。


题很水,人很蠢。

代码

//QWsin
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=600000+10;
const int maxm=1200000+10;
inline int read()
{int ret=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();for(;ch>='0'&&ch<='9';ch=getchar()) ret=ret*10+ch-'0';return ret;
}int to[maxn];int first[maxn],next[maxm],ecnt;
struct Edge{int u,v;Edge(int u=0,int v=0):u(u),v(v){}}e[maxm];
inline void add_edge(int u,int v)
{next[ecnt]=first[u];first[u]=ecnt;e[ecnt++]=Edge(u,v);next[ecnt]=first[v];first[v]=ecnt;e[ecnt++]=Edge(v,u);
}int top[maxn],hv[maxn],sz[maxn],p[maxn],dep[maxn];
int tag[maxn];  int dfs1(int u,int fa,int deep=1)
{p[u]=fa;dep[u]=deep;sz[u]=1;int msz=0;for(int i=first[u];i!=-1;i=next[i]) if(e[i].v!=fa){int lch=dfs1(e[i].v,u,deep+1);if(lch > msz) msz=lch,hv[u]=e[i].v;sz[u]+=lch;}return sz[u];
}void dfs2(int u,int Top)
{top[u]=Top;if(sz[u]==1) return ;dfs2(hv[u],Top);for(int i=first[u];i!=-1;i=next[i])if(e[i].v!=p[u]&&e[i].v!=hv[u]) dfs2(e[i].v,e[i].v);
}int LCA(int a,int b)
{for(;top[a]!=top[b];b=p[top[b]])if(dep[top[a]] > dep[top[b]]) swap(a,b);return dep[a]<dep[b]?a:b;
}int ans[maxn],sum,n;
int dfs3(int cur)
{int sum=tag[cur];for(int i=first[cur];i!=-1;i=next[i]) if(e[i].v!=p[cur]) sum+=dfs3(e[i].v);if(to[1]!=cur) ans[cur]=sum-1;else ans[cur]=sum; return sum;
}int main()
{n=read();memset(first,-1,sizeof(first));for(int i=1;i<=n;i++) to[i]=read();for(int i=1;i<n;i++) add_edge(read(),read());int root=1;dfs1(root,root);dfs2(root,root);tag[to[1]]++;tag[to[2]]++;int lca=LCA(to[1],to[2]);tag[lca]--;if(lca!=root) tag[p[lca]]--;for(int i=2;i<n;i++){int lca=LCA(to[i],to[i+1]);tag[to[i]]++;tag[to[i+1]]++;tag[lca]--;if(lca!=root) tag[p[lca]]--;}dfs3(root);for(int i=1;i<=n;i++) printf("%d\n",ans[i]);return 0;
}

bzoj 3631 [JLOI2014]松鼠的新家相关推荐

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

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

  2. 3631: [JLOI2014]松鼠的新家

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 707  Solved: 342 [Submit][Sta ...

  3. 3631. [JLOI2014]松鼠的新家【树形DP】

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

  4. 【BZOJ 3631】 [JLOI2014]松鼠的新家

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 681 Solved: 329 [Submit][Statu ...

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

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

  6. P3258 [JLOI2014]松鼠的新家

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

  7. 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告

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

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

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

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

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

最新文章

  1. 比特币vs分布式账本vs以太坊vs区块链
  2. 宏基因组合种树第292期—侧柏、樟子松,为祖国绿化做贡献
  3. R语言ggplot2可视化:使用ggrepel包在线图(line plot)的尾端那个数据点添加文本标签(text label)
  4. Leetcode 344. 反转字符串 解题思路及C++实现
  5. 2 0 2 0 年 第 十 一 届 蓝 桥 杯 - 国赛 - CC++大学B组 - A.美丽的2
  6. 程序开发,面试恐惧症_如何克服恐惧并停止讨厌的工作面试
  7. RabbitMQ-使用@RabbitListener注解消费消息
  8. HDU1274 展开字符串【文本处理】
  9. 视图控制器的View创建方式
  10. VS2010 安装包打包(转)
  11. 学习总结(一):ad画板总结
  12. 【scratch案例教学】scratch端午节划龙舟比赛 scratch创意编程 少儿编程 边玩边学过个快乐端午节
  13. 支付宝小程序复制到剪贴板
  14. HFSS周期结构超表面结构单元仿真
  15. 自然辩证法与计算机科学与技术,自然辩证法与计算机科学技术.pdf
  16. 手绘板的制作——重置与橡皮擦(2)
  17. tp5使用xunsearch
  18. poj-2905 The Pilots Brothers' refrigerator
  19. 如何把生活过程升级打怪?
  20. SpringBoot+Vue项目大学生网络教学平台的设计与实现

热门文章

  1. Ubuntu连接投影仪时,分辨率不匹配引起的错误
  2. 软件测试——缺陷(缺陷的基本概、缺陷的生命周期、缺陷的识别)
  3. Java中的对象和类
  4. .NET平台下,使用字母进行中文模糊查询
  5. 电商api接口,淘宝/天猫、1688、拼多多、亚马逊等api接口
  6. h3c虚拟化服务器配置,H3C CAS 虚拟化平台安装部署
  7. Themeleaf做判断
  8. 朝阳python培训
  9. 基于Android的旅游助手app酒店景点预订系统
  10. 零基础怎么入门python