NOIP2016 天天爱跑步(树上差分)
题意
给定一棵树,从时刻 0 开始,有若干人从 S[i] 出发向 T[i] 移动,每单位时刻移动一条边
对于树上每个点 x,求 w[x] 时刻有多少人恰好路过 x
N,M≤300000
题解
从上午11点做到下午3点45终于做出来了。
一开始坚持自己的想法,发现错了之后不知道怎么改,无奈看了题解。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int N=;
vector<int> v1[N],v2[N],v3[N],v4[N];
int cnt,head[N];
int fa[N][],dep[N];
int book1[N],book2[N*];
int n,m,w[N],ans[N];
struct edge{
int to,nxt;
}e[N*];
void add(int u,int v){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void dfs1(int u,int f,int deep){
fa[u][]=f;
dep[u]=deep;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f)continue;
dfs1(v,u,deep+);
}
}
int lca(int u,int v){
if(dep[u]<dep[v])swap(u,v);
for(int i=;i>=;i--){
if(dep[fa[u][i]]>=dep[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 dfs2(int u){
ans[u]=book1[w[u]+dep[u]]+book2[w[u]-dep[u]+N];
for(int i=;i<v1[u].size();i++){
book1[v1[u][i]]++;
}
for(int i=;i<v2[u].size();i++){
book1[v2[u][i]]--;
}
for(int i=;i<v3[u].size();i++){
book2[v3[u][i]]++;
}
for(int i=;i<v4[u].size();i++){
book2[v4[u][i]]--;
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u][])continue;
dfs2(v);
}
ans[u]=book1[w[u]+dep[u]]+book2[w[u]-dep[u]+N]-ans[u];
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n-;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dfs1(,,);
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
fa[j][i]=fa[fa[j][i-]][i-];
for(int i=;i<=n;i++){
scanf("%d",&w[i]);
}
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
int c=lca(u,v);
v1[u].push_back(dep[u]);
v2[fa[c][]].push_back(dep[u]);
v3[v].push_back(dep[u]-*dep[c]+N);
v4[c].push_back(dep[u]-*dep[c]+N);
}
for(int i=;i<v1[].size();i++){
book1[v1[][i]]++;
}
for(int i=;i<v2[].size();i++){
book1[v2[][i]]--;
}
for(int i=;i<v3[].size();i++){
book2[v3[][i]]++;
}
for(int i=;i<v4[].size();i++){
book2[v4[][i]]--;
}
dfs2();
for(int i=;i<=n;i++){
printf("%d ",ans[i]);
}
return ;
}
NOIP2016 天天爱跑步(树上差分)的更多相关文章
- 洛谷 1600 (NOIp2016) 天天爱跑步——树上差分
题目:https://www.luogu.org/problemnew/show/P1600 看TJ:https://blog.csdn.net/clove_unique/article/detail ...
- NOIP2016 天天爱跑步 (树上差分+dfs)
题目大意:给你一颗树,树上每个点都有一个观察员,他们仅会在 w[i] 时刻出现,观察正在跑步的玩家 一共有m个玩家,他们分别从节点 s[i] 同时出发,以每秒跑一条边的速度,沿着到 t[i] 的唯一路 ...
- [NOIP2016]天天爱跑步(树上差分+线段树合并)
将每个人跑步的路径拆分成x->lca,lca->y两条路径分别考虑: 对于在点i的观察点,这个人(s->t)能被观察到的充要条件为: 1.直向上的路径:w[i]=dep[s]-dep ...
- NOIP2016 天天爱跑步 - 树上差分
传送门 题目分析: 一年前还是个傻子的时候居然直接放弃了这题. 首先列出两个方程:如果i节点的观察员能够观察到由s->t的那个人,那么: \[dep[s] - dep[i] = w[i], de ...
- NOIP2016 Day1 T2 天天爱跑步(树上差分,LCA)
原文链接 原题链接 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏 ...
- 洛谷P1600 天天爱跑步——树上差分
题目:https://www.luogu.org/problemnew/show/P1600 看博客:https://blog.csdn.net/clove_unique/article/detail ...
- 洛谷$P1600$ 天天爱跑步 树上差分
正解:树上差分 解题报告: 传送门$QwQ$! 这题还挺妙的,,,我想了半天才会$kk$ 首先对一条链$S-T$,考虑先将它拆成$S-LCA$和$LCA-T$,分别做.因为总体上来说差不多接下来我就只 ...
- BZOJ 4719--天天爱跑步(LCA&差分)
4719: [Noip2016]天天爱跑步 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1464 Solved: 490[Submit][Stat ...
- [NOIp2016]天天爱跑步 线段树合并
[NOIp2016]天天爱跑步 LG传送门 作为一道被毒瘤出题人们玩坏了的NOIp经典题,我们先不看毒瘤的"动态爱跑步"和"天天爱仙人掌",回归一下本来的味道. ...
- [Noip2016]天天爱跑步 LCA+DFS
[Noip2016]天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时上线,完成打卡任 ...
随机推荐
- javascript对象的深度克隆
在做项目的时候需要向对象里面添加新属性,又不想修改原对象.于是就写: var newObj = oldObj,但是新对象属性改变后就对象也会跟着改变,这是因为无论是新对象还是旧对象,指向的内存地址都是 ...
- java代码递归部门结构树
组织所有部门树,以及条件查询部门树: /** * 组织部门树 * @return */ @Override public List<SxyBranchVO> findAllBranchTr ...
- Visual Studio 2015 官方下载及密钥
Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品.Visual Studio 2015 是一个丰富的集成开发环境,可用于创建出色的 Windows.Andr ...
- Python的Flask框架入门-Ubuntu
全文请见tuts code:An Introduction to Python's Flask Framework Flask是Python一个小而强大的web框架.学起来简单,用起来也容易,能够帮你 ...
- Ajax :六个全局事件
加载请求: .ajaxStart() 和 .ajaxstop() $(document).ajaxStart(function(){ $('.loading').show(); }).ajaxStop ...
- windows连接投影仪后桌面画面和白板画面不一致
windows连接投影仪后桌面画面和白板画面不一致: 一. windows 搜索: 投影仪 选择相应的效果:
- ActiveMQ学习笔记(19)----Consumer高级特性(一)
1. Exclusive Consumer 独有消费者:Queue中的消息是按照顺序被分发到consumer的,然而,当你有多个consumers同时从相同的queue中提取消息时,你将失去这个保证. ...
- Mac 如何修改Mac系统的默认截图路径
step 1 :打在桌面或者其他任意位置创建一个文件夹:截图图库.我创建的路径是:/Users/yilin/Documents/截图图库(仅供参考) step 2:打开终端,输入以下命令:defaul ...
- [ZJOI2015]诸神眷顾的幻想乡 广义后缀自动机_DFS_语文题
才知道题目中是只有20个叶子节点的意思QAQ.... 这次的广义后缀自动机只是将 last 设为 1, 并重新插入. 相比于正统的写法,比较浪费空间. Code: #include <cstdi ...
- 浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
html_entity_decode():把html实体转换为字符. $str = "just atest & 'learn to use '"; echo html_en ...