松鼠的新家 LCA + 树上差分
题意
中文题意就不需要分析了吧
分析
首先两点之间,我们应该去走最短路径最能得到最优解,所以很容易想到求LCA,假设两点分别为x,y,LCA(x,y) = u,所以只需要把路径 x -> u -> y上的所有点加上一个糖果即可,暴力做法肯定会t,所以我们考虑一种很巧妙额做法:树上差分
两个子节点+ 1,LCA - 1最后因为LCA在这条路径上因为两点子节点都加了1,所以造成LCA增加了两次,需要给LCA和他的父节点 - 1
最后因为除了出发的点,每一个点都即成为了一次出发点,也成为了一次终点,但是只需要放置一颗糖果即可,而且最后那个点题目说了不需要放置糖果,所以需要每个点 - 1
代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
#define debug(x) cout<<#x<<":"<<x<<endl;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const int N = 3e5 + 10;
int h[N],e[N * 2],ne[N * 2],idx;
int d[N];
int a[N];
int num[N];
int ans[N];
int f[N][31];
int n,m;void add(int a,int b){ne[idx] = h[a],e[idx] = b,h[a] = idx++;
}void bfs(int root){memset(d,0x3f,sizeof d);d[0] = 0,d[root] = 1;queue<int> Q;Q.push(root);while(Q.size()){int t = Q.front();Q.pop();for(int i = h[t];~i;i = ne[i]){int j = e[i];if(d[j] > d[t] + 1){d[j] = d[t] + 1;Q.push(j);f[j][0] = t;for(int k = 1;k <= 30;k++)f[j][k] = f[f[j][k - 1]][k - 1];}}}
}int LCA(int a,int b){if(d[a] < d[b]) swap(a,b);for(int i = 30;i >= 0;i--)if(d[f[a][i]] >= d[b])a = f[a][i];if(a == b) return a;for(int i = 30;i >= 0;i--)if(f[a][i] != f[b][i])a = f[a][i],b = f[b][i];return f[a][0];
}void dfs(int u,int fa){for(int i = h[u];~i;i = ne[i]){int j = e[i];if(j == fa)continue;dfs(j, u);num[u] += num[j];}
}int main(){memset(h,-1,sizeof h);scanf("%d",&n);m = n - 1;for(int i = 1;i <= n;i++) scanf("%d",&a[i]);while(m--){int a,b;scanf("%d%d",&a,&b);add(a,b),add(b,a);}bfs(1);for(int i = 1;i < n;i++){int x = a[i],y = a[i + 1];int u = LCA(x,y);num[f[u][0]]--;num[u]--;num[x]++;num[y]++;}dfs(1,0);for(int i = 2;i <= n;i++) num[a[i]]--;for(int i = 1;i <= n;i++) printf("%d\n",num[i]);return 0;
}/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
松鼠的新家 LCA + 树上差分相关推荐
- P3258[JLOI2014]松鼠的新家(LCA 树上差分)
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- [JLOI2014]松鼠的新家【树上差分】
Pro QwQ Sol 很裸的一道树上差分,不过和往常还不太一样. 根据题目中给出的ai来差分,最后肯定有点被多加了值,所以最后再跑一边去掉就好. 然而-- 我lca的模板打错了-- Code #in ...
- P3258 [JLOI2014]松鼠的新家(树上点查分)
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上. ...
- [Luogu 3258] JLOI2014 松鼠的新家
[Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...
- 松鼠的新家(树上点差分 + LCA)
题目: 松鼠的新家是一棵树,前几天刚刚装修好了新家,新家有 个房间,并且有 根树枝连接,每个房间都可以相互到达,且任两个房间之间的路线都是唯一的.天哪,他居然真的住在「树」上.松鼠想邀请小熊维尼前来参 ...
- bzoj 3631: [JLOI2014]松鼠的新家(LCA+树上差分)
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 2059 Solved: 1030 [Submit][S ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 树上差分
缘起 [1]中我们学习了树上差分,并且a了一个裸的点差分. 现在继续树上差分~ 洛谷 P3258 [JLOI2014]松鼠的新家 分析 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房 ...
- P3258 [JLOI2014]松鼠的新家
文章目录 题意: 题解: 树上差分 代码: 树链剖分 代码: P3258 [JLOI2014]松鼠的新家 题意: n个点,n-1条边,给出每个点的拜访顺序,问每个点经过几次(最后一次移动不算拜访) 题 ...
- Luogu_P3258 松鼠的新家
松鼠的新家 链接 Luogu_P3258 松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有nnn个房间,并且有n−1n-1n−1根树枝连接,每个房间都可以相互到达,且俩个房间之间 ...
最新文章
- 游遍中国 —— 大街小巷、秘境与远方
- 可访问范围 与 visual 或 abstract “修饰符”
- css钢铁侠视角,CSS3 Iron Man 钢铁侠肖像
- 小米功能机支持java吗_小米竟然卖功能机了!2.8吋/15天超长待机
- LeetCode 1354. 多次求和构造目标数组(优先队列+逆向思考)
- Python 抛异常处理(精)
- Javaweb之session创建销毁问题
- R语言含中文数据导入的方法
- 养一辆最新的奥迪Q7一年要花费多少钱?
- flink安装以及运行自带wordcount示例(单机版,无hadoop环境)
- [转载] Dubbo架构设计详解
- 一篇好奇心文,带你看懂基金的运营全貌
- 制作dnf脚本Java_易语言制作DNF解封源码
- NRF52840 USB串口例程
- 用matlab做一元线性回归画图,[转载]用matlab做一元线性回归分析
- matlab模拟厄米高斯光束,拉盖尔高斯光束_厄米高斯光束MATLAB仿真.pdf
- 使用深度学习自动给图片生成文字描述
- win10计算机控制面板在哪里,windows10系统控制面板在哪里?快速找到Win10控制面板的三种方法...
- Gentoo安装教程(Systemd+Gnome)
- 电脑开机后进不了系统怎么办?
热门文章
- 【笔记】input data to the valid range for imshow with RGB data [0..1] for floats or [0.255] for integers
- Flutter尽然还能有这种操作!送大厂面经一份!
- 2D转3D技术的优势
- m3u8及TS文件下载解密:用FFmpeg解密合并m3u8中ts文件(二)
- 用python编写密码安全性_用大数据python保护密码
- 计算机考研 学渣逆袭上清华,学渣逆袭:曾挂科8门学分绩点1.08 考上北大研究生...
- 【linux】循序渐进学运维-基础篇-mount
- 如何度过中年危机(转)
- (55)FPGA时序违例的根本原因?
- 基于Linux(CentOS7)的网络服务器配置