bzoj3631: [JLOI2014]松鼠的新家(树上差分)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3631
题目大意:给定含有n个顶点的树,给定走遍整棵树顺序的序列a[1],a[2],a[3]……a[n],表示要从a[1]走到a[2],再从a[2]走到a[3],直到走到a[n],经过的点的点权需要加1,最后输出每个点的点权。
解题思路:首先我们讨论对于走一次的情况,假设从s走到t,我们可以让ans[s]++,ans[t]++,ans[LCA(s,t)]--,并且让s和t的LCA的父亲也减1,最后上推,然后第2个节点到第n个节点多走了一次,就减去1就可以了。
代码:
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int maxn=+;
- int n,tot,a[maxn],head[maxn],fa[maxn][],depth[maxn],ans[maxn];
- struct Edge{
- int v,next;
- }edge[maxn*];
- void add(int u,int v){
- edge[tot].v=v;
- edge[tot].next=head[u];
- head[u]=tot++;
- }
- void dfs(int u,int pre){
- depth[u]=depth[pre]+;
- fa[u][]=pre;
- for(int i=;i<=;i++)
- fa[u][i]=fa[fa[u][i-]][i-];
- for(int i=head[u];i!=-;i=edge[i].next){
- int v=edge[i].v;
- if(v==pre) continue;
- dfs(v,u);
- }
- }
- int LCA(int u,int v){
- if(depth[u]<depth[v]) swap(u,v);
- for(int i=;i>=;i--){
- if(depth[u]-(<<i)>=depth[v]) u=fa[u][i];
- }
- if(u==v) return u;
- for(int i=;i>=;i--){
- if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
- }
- return fa[u][];
- }
- void dfs1(int u,int pre){
- for(int i=head[u];i!=-;i=edge[i].next){
- int v=edge[i].v;
- if(v==pre) continue;
- dfs1(v,u);
- ans[u]+=ans[v];
- }
- }
- int main(){
- scanf("%d",&n);
- for(int i=;i<=n;i++) scanf("%d",&a[i]);
- memset(head,-,sizeof(head));
- for(int i=;i<n;i++){
- int u,v;
- scanf("%d%d",&u,&v);
- add(u,v); add(v,u);
- }
- depth[]=-;
- dfs(,);
- for(int i=;i<n;i++){
- ans[a[i]]++;
- ans[a[i+]]++;
- int lca=LCA(a[i],a[i+]);
- ans[fa[lca][]]--;
- ans[lca]--;
- }
- dfs1(,);
- for(int i=;i<=n;i++)ans[a[i]]--;
- for(int i=;i<=n;i++)
- printf("%d\n",ans[i]);
- return ;
- }
bzoj3631: [JLOI2014]松鼠的新家(树上差分)的更多相关文章
- bzoj3631 [JLOI2014]松鼠的新家——树上差分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3631 树上差分:注意路径的结尾被多算了一次,最后要减去(不能提前减). 代码如下: #inc ...
- BZOJ 3631: [JLOI2014]松鼠的新家 树上差分 + LCA
Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- [JLOI2014]松鼠的新家 树上差分
差分 一开始竟然想分情况讨论来差分,然后发现各自情况要分析, 就是为了解决中间节点重复计算的问题, 结果 最后一想,中间重复计算了一次,那我最后减掉不就好了么,,, 那这就是一道差分裸题了(这是唯一不 ...
- BZOJ.3631.[JLOI2014]松鼠的新家(树上差分)
题目链接 树剖/差分裸题.. //28260kb 584ms #include <cstdio> #include <cctype> #include <algorith ...
- [Bzoj3631][JLOI2014]松鼠的新家 (树上前缀和)
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2350 Solved: 1212[Submit][Sta ...
- BZOJ3631 [JLOI2014]松鼠的新家 【树上差分】
题目 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上.松鼠想 ...
- [BZOJ3631]:[JLOI2014]松鼠的新家(LCA+树上差分)
题目传送门 题目描述: 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...
- 【bzoj3631】[JLOI2014]松鼠的新家 LCA+差分数组
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来 ...
- bzoj3631[JLOI2014 松鼠的新家 倍增lca+差分
裸的树上差分+倍增lca 每次从起点到终点左闭右开,这就有一个小技巧,要找到右端点向左端点走的第一步,然后差分就好了 #include<cstdio> #include<cstrin ...
- BZOJ 3631 松鼠的新家 树上差分
我猜会有智障说直接链剖+线段树…(希望没有) From RYC's 课件 然鹅我并不反对树剖...我是智障...QAQ 好吧还是树上差分:设 a[i]=u.a[i+1]=v ++w[u],++w[v] ...
随机推荐
- Python深度学习读书笔记-4.神经网络入门
神经网络剖析 训练神经网络主要围绕以下四个方面: 层,多个层组合成网络(或模型) 输入数据和相应的目标 损失函数,即用于学习的反馈信号 优化器,决定学习过程如何进行 如图 3-1 所示:多个层 ...
- DeepFaceLab 如何开启轻量级编码器?
很多人可能没有了解过这个参数.其实对于某些显存比较低的人,或者想要快点出结果的人非常有用. 什么是轻量级编码器? 轻量级本质上就是降低了神经网络的复杂程度(什么是神经网络? 这个….) 启用这个选项后 ...
- 阶段3 1.Mybatis_12.Mybatis注解开发_3 mybatis注解开发保存和更新功能
使用直接来实现CRUD操作 Insert方法 创建测试类 把变量都定义在外面 写测试方法 修改链接的数据库 update方法 再加上address 被更新的数据
- Java多线程学习——图片下载
实现多线程方式1:继承类Thread——重写方法run——调用方法start 从网络下载图片首先要增加包commons-io.jar import org.apache.commons.io.File ...
- 分类属性绘图(seaborn的catplot函数)
可以通过指定catplot()函数的kind参数为"bar", "box", "violin"等分别绘制以前提过的柱形图,盒图,小提琴图等. ...
- 【Linux开发】Linux启动脚本设置
前言linux有自己一套完整的启动 体系,抓住了linux启动 的脉络,linux的启动 过程将不再神秘.阅读之前建议先看一下附图.本文中假设inittab中设置的init tree为:/etc/rc ...
- input标签内容改变时触发事件
1. onchange事件与onpropertychange事件的区别: onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发: onpropertychange事件是实时触发,每增加 ...
- .net core 学习小结之 配置介绍(config)以及热更新
命令行的配置 var settings = new Dictionary<string, string>{ { "name","cyao"}, {& ...
- spring boot 异常汇总
spring boot JPA 异常: org.springframework.data.mapping.PropertyReferenceException: No property role fo ...
- kubernetes快速应用入门
kubectl 就是 api server的客户端工具 创建一个nginx的pod [root@master ~]# kubectl run nginx-deploy --image=nginx:1. ...