题意

中文题意就不需要分析了吧

分析

首先两点之间,我们应该去走最短路径最能得到最优解,所以很容易想到求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 + 树上差分相关推荐

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

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

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

    Pro QwQ Sol 很裸的一道树上差分,不过和往常还不太一样. 根据题目中给出的ai来差分,最后肯定有点被多加了值,所以最后再跑一边去掉就好. 然而-- 我lca的模板打错了-- Code #in ...

  3. P3258 [JLOI2014]松鼠的新家(树上点查分)

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

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

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

  5. 松鼠的新家(树上点差分 + LCA)

    题目: 松鼠的新家是一棵树,前几天刚刚装修好了新家,新家有 个房间,并且有 根树枝连接,每个房间都可以相互到达,且任两个房间之间的路线都是唯一的.天哪,他居然真的住在「树」上.松鼠想邀请小熊维尼前来参 ...

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

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

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

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

  8. P3258 [JLOI2014]松鼠的新家

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

  9. Luogu_P3258 松鼠的新家

    松鼠的新家 链接 Luogu_P3258 松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有nnn个房间,并且有n−1n-1n−1根树枝连接,每个房间都可以相互到达,且俩个房间之间 ...

最新文章

  1. 游遍中国 —— 大街小巷、秘境与远方
  2. 可访问范围 与 visual 或 abstract “修饰符”
  3. css钢铁侠视角,CSS3 Iron Man 钢铁侠肖像
  4. 小米功能机支持java吗_小米竟然卖功能机了!2.8吋/15天超长待机
  5. LeetCode 1354. 多次求和构造目标数组(优先队列+逆向思考)
  6. Python 抛异常处理(精)
  7. Javaweb之session创建销毁问题
  8. R语言含中文数据导入的方法
  9. 养一辆最新的奥迪Q7一年要花费多少钱?
  10. flink安装以及运行自带wordcount示例(单机版,无hadoop环境)
  11. [转载] Dubbo架构设计详解
  12. 一篇好奇心文,带你看懂基金的运营全貌
  13. 制作dnf脚本Java_易语言制作DNF解封源码
  14. NRF52840 USB串口例程
  15. 用matlab做一元线性回归画图,[转载]用matlab做一元线性回归分析
  16. matlab模拟厄米高斯光束,拉盖尔高斯光束_厄米高斯光束MATLAB仿真.pdf
  17. 使用深度学习自动给图片生成文字描述
  18. win10计算机控制面板在哪里,windows10系统控制面板在哪里?快速找到Win10控制面板的三种方法...
  19. Gentoo安装教程(Systemd+Gnome)
  20. 电脑开机后进不了系统怎么办?

热门文章

  1. 【笔记】input data to the valid range for imshow with RGB data [0..1] for floats or [0.255] for integers
  2. Flutter尽然还能有这种操作!送大厂面经一份!
  3. 2D转3D技术的优势
  4. m3u8及TS文件下载解密:用FFmpeg解密合并m3u8中ts文件(二)
  5. 用python编写密码安全性_用大数据python保护密码
  6. 计算机考研 学渣逆袭上清华,学渣逆袭:曾挂科8门学分绩点1.08 考上北大研究生...
  7. 【linux】循序渐进学运维-基础篇-mount
  8. 如何度过中年危机(转)
  9. (55)FPGA时序违例的根本原因?
  10. 基于Linux(CentOS7)的网络服务器配置