BZOJ 4719--天天爱跑步(LCA差分)
4719: [Noip2016]天天爱跑步
Time Limit: 40 Sec Memory Limit: 512 MB
Submit: 1464 Solved: 490
[Submit][Status][Discuss]
Description
Input
Output
输出1行N 个整数,第个整数表示结点的观察员可以观察到多少人。
Sample Input
2 3
1 2
1 4
4 5
4 6
0 2 5 1 2 3
1 5
1 3
2 6
Sample Output
HINT
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=4719
Solution
刚开始学OI的时候就看过这道题。。。当时是贴代码过的。。。。
记得好像是用树链剖分。。不记得了。。反正很长。。。
现在快要noip了。。。把往年的题目拿出来看一下,算是临近noip的梳理吧。。。。。
好多废话
进入正题。。。。。
首先每个人都要走最短路径。。。马上想到LCA。。。不然还能有什么。。。
每个人分别统计显然是不行的,不过似乎可以根据特殊情况水很多分。。
于是想到差分。。
假设第 i 个人的起点为 Si ,终点为 Ti 。。LCA ( Si ,Ti ) = rt
每条线段长度都是 1 ,故路径长度与深度有关。。。
于是路径就可以分成两部分:Si -> rt 和 rt ->Ti
两条路径分开统计。。。
在向上的路径中,比如一个起点 Si ,深度为 dep [ Si ] ,
那么可以在遍历到Si的时候 U [ dep [ Si ] ] ++;
然后在到达 rt 的父亲的时候 U [ dep [ Si ] ] --; (U [ i ]表示某一方向路径的总值)
向下的路径用一样的方法。。。但这样rt 的统计会有重复。。
所以两次统计中要有一次在 rt 的时候就 U [ dep [ Si ] ] - - ;
这样就可以了,虽然分析很长但代码不是很长。。。。
注意在BZOJ上提交不能有末尾空格。。。害我PE了一发。。。
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define N 400000
using namespace std;
inline int Read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int n,m,cnt=0;
int fa[N][22];
int hed[N],w[N],dep[N],ans[N],U[N],D[N<<1];
struct edge{int r,nxt;
}e[N<<1];
struct node{int u,w;
};
vectore1[N],e2[N<<1];
void insert(int u,int v){e[++cnt]=(edge){v,hed[u]};hed[u]=cnt;e[++cnt]=(edge){u,hed[v]};hed[v]=cnt;
}
void dfs1(int x,int F){for(int i=1;(1<<i)<=dep[x];i++)fa[x][i]=fa[fa[x][i-1]][i-1];for(int i=hed[x];i;i=e[i].nxt)if(e[i].r!=F){dep[e[i].r]=dep[x]+1;fa[e[i].r][0]=x;dfs1(e[i].r,x);}
}
int lca(int u,int v){if(dep[u]<dep[v])swap(u,v);int d=dep[u]-dep[v];for(int i=0;(1<<i)<=d;i++)if((1<<i)&d)u=fa[u][i];if(u==v)return u;for(int i=20;i>=0;i--){if((1<<i)>dep[u] || fa[u][i]==fa[v][i])continue;u=fa[u][i];v=fa[v][i];}return fa[u][0];
}
void dfs2(int x,int F){ans[x]-=U[w[x]+dep[x]];ans[x]-=D[w[x]-dep[x]+n];for(int i=0;i<e1[x].size();i++)U[e1[x][i].u]+=e1[x][i].w;for(int i=0;i<e2[x].size();i++)D[e2[x][i].u+n]+=e2[x][i].w;for(int i=hed[x];i;i=e[i].nxt)if(e[i].r!=F)dfs2(e[i].r,x);ans[x]+=U[w[x]+dep[x]]+D[w[x]-dep[x]+n];
}
int main(){int u,v,rt;n=Read();m=Read();for(int i=1;i<n;i++){u=Read();v=Read();insert(u,v);}for(int i=1;i<=n;i++)w[i]=Read();dfs1(1,0);for(int i=1;i<=m;i++){u=Read();v=Read();rt=lca(u,v);e1[u].push_back((node){dep[u],1});e1[rt].push_back((node){dep[u],-1});e2[v].push_back((node){dep[u]-(dep[rt]<<1),1});e2[fa[rt][0]].push_back((node){dep[u]-(dep[rt]<<1),-1});}dfs2(1,0);for(int i=1;i<n;i++)printf("%d ",ans[i]);printf("%d",ans[n]);return 0;
}
This passage is made by Iscream-2001.
转载于:https://www.cnblogs.com/Yuigahama/p/7767829.html
BZOJ 4719--天天爱跑步(LCA差分)相关推荐
- [luogu]P1600 天天爱跑步[LCA]
[luogu]P1600 [NOIP 2016]天天爱跑步 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上 ...
- [NOIP2016]天天爱跑步(lca+乱搞)
2557. [NOIP2016]天天爱跑步 时间限制:2 s 内存限制:512 MB [题目描述] 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑 ...
- [BZOJ4719][P1600][NOIP2016]天天爱跑步[LCA+dfs序+差分]
题意:一棵树,有 \(m\) 个人从 \(s_i\) 到 \(t_i\) 跑步,每个人的速度都是1,每个点有一个观察员 当一个人在w[i]经过第 \(i\) 个点的时候 第 \(i\) 个点的答案+1 ...
- [NOIP2016 提高组] 天天爱跑步(树上差分)
如果没有时间的限制,这题就是对每个点iii,求经过iii的路径数,用树上差分解决即可: 枚举路径x→y{x\to y\{x→y{ a[x]+=1;a[y]+=1;a[x]+=1;a[y]+=1;a[x ...
- 天天爱跑步——树上差分
先来一道简化版: 关联点 2 • 给出一棵二叉树,每个点有点权 ?? • 如果 ? 在 ? 的左(右)子树中,且 ? 到 ? 的距离为 ??,则称 ? 为 ? 的左(右)关联点 • 求每个点的左.右关 ...
- BZOJ 4719: [Noip2016]天天爱跑步 线段树合并
title BZOJ 4719 LUOGU 1600 简化题意: 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每 ...
- NOIP2016天天爱跑步 题解报告【lca+树上统计(桶)】
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 nn个 ...
- [NOIP2016]天天爱跑步 题解(树上差分) (码长短跑的快)
Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要 玩家每天按时上线,完成打卡任务.这个游戏的地图 ...
- [noip2016]天天爱跑步(主席树+lca)
恩..在百度的第一页翻了翻,没有用主席树做的,于是打算水一篇blog: 天天爱跑步 首先有一个解题的关键: 将玩家的向上和向下分成两部分: 先定义几个变量,s是起点,t是终点,wi是每个观察员出现的时 ...
最新文章
- 使用Process.Start打开文件夹或网页
- 5.分布式数据库HBase第1部分
- Mysql高性能优化规范建议,太厉害了!
- 达人篇:2.1)零缺陷管理法;
- javascript高程3 学习笔记(二)
- 简单看看 Go 1.17 的新版调用规约
- 为特使建立控制平面的指南-识别组件
- 洛谷 P2590 BZOJ 1036 [ZJOI2008]树的统计
- Matlab for Mac 中文路径乱码解决
- mybatis的trim标签
- 【智驾深谈】想拿自动驾驶融资,先过VC这16问
- win7升级win10时报0x80072F8F - 0x20000错误处理
- 分享几个免费的根据IP 获取地址的链接
- OPC DA 到 OPC UA
- 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
- 分布式tensorflow测试代码
- openCv4Android之fitLine中各算法总结
- 数据页和数据行(翻译)
- 谷歌研究利用AI合成图片,使静态图片动起来
- HIS Metrics
热门文章
- Android热修复实现及原理
- 条件变量、pthread_cond_init
- 为什么开发人员要使用Linux
- 从源码角度理解 FragmentTransaction实现
- YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24
- 【netty】netty HashedWheelTimer 延时队列
- 【算法】剑指 Offer 67. 把字符串转换成整数
- 【maven】maven IDEA 设置 上传jar 包 distributionManagement
- 95-38-025-Buffer-Buffer
- 【Flink】Flink 如何 保证 同一个key对应的state是一个呢?KeyedProcessFunction