洛谷P1600 天天爱跑步
时间:2019-11-14
本文章向大家介绍洛谷P1600 天天爱跑步,主要包括洛谷P1600 天天爱跑步使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
将每个玩家的路径看作两部分:向根上行以及向叶子下行
p为每个点出现观察员的时间。子树中的起点u到当前点v的路径即是上行,如果dep[v]+p[v]=dep[u],则u对v产生一个贡献。当前点u到子树中终点v的路径即是下行,如果dep[v]-dis(x,v)=dep[u]-p[u](x为这条路径的起点,v为终点,dis(x,v)为两点的距离),则v对u产生一个贡献。
树上差分,将所有路径标记到树上。开两个桶分别存所有起点的dep[x]和所有终点的dep[x]-dis,在起点和终点处使贡献+1,在lca处把它们的贡献分别-1,表示出了这棵子树以后不再产生贡献。统计答案的时候,如果一条路径对lca产生了贡献,那么起点和终点都会算一次,因此lca处将贡献-1的时候要判断是否被这条路径贡献了答案。
查询某棵子树中点的答案的时候,有可能其它子树的贡献仍然留在桶内。由于这道题只是记录贡献的累计,因此在dfs到达某个点的时候记录一次答案,将要出这个点的时候再查询一次答案,减去第一次记录的值使差值成为最终答案。
统计某个点的答案时,先把所有+1的贡献扔进桶里,进行查询,再处理所有贡献-1的操作。
#include<iostream> #include<cstdio> #include<vector> using namespace std; const int N=300010,M=300010; int n,m,a[N]; int ver[2*N],Next[2*N],head[N],tot; int dep[N],ans[2][N]; int c[2][600010]; struct node{ int opt,val,x,dis; node(int a=0,int b=0,int c=0,int d=0){ opt=a,val=b,x=c,dis=d; } }; vector<node>s[N]; void add(int x,int y){ ver[++tot]=y; Next[tot]=head[x]; head[x]=tot; } int st[N][21]; void dfs(int x,int fa){ for(int i=1;i<=20;i++){ st[x][i]=st[st[x][i-1]][i-1]; if(!st[x][i])break; } for(int i=head[x];i;i=Next[i]){ int y=ver[i]; if(y==fa)continue; dep[y]=dep[x]+1; st[y][0]=x; dfs(y,x); } } int get(int x,int y){ if(dep[x]<dep[y])swap(x,y); for(int i=20;i>=0;i--){ if(st[x][i]&&dep[st[x][i]]>=dep[y])x=st[x][i]; } if(x==y)return x; for(int i=20;i>=0;i--){ if(st[x][i]!=st[y][i]){ x=st[x][i],y=st[y][i]; } } return st[x][0]; } void dfs1(int x,int fa){ ans[0][x]=c[0][dep[x]+a[x]]; ans[1][x]=c[1][dep[x]-a[x]+N]; for(int i=head[x];i;i=Next[i]){ int y=ver[i]; if(y==fa)continue; dfs1(y,x); } for(int i=0;i<s[x].size();i++){ int v=s[x][i].x,val=s[x][i].val,opt=s[x][i].opt,dis=s[x][i].dis; if(val==-1)continue; if(opt==0){ c[0][dep[v]]+=val; } else{ c[1][dep[v]-dis+N]+=val; } } ans[0][x]=c[0][dep[x]+a[x]]-ans[0][x]; ans[1][x]=c[1][dep[x]-a[x]+N]-ans[1][x]; for(int i=0;i<s[x].size();i++){ int v=s[x][i].x,val=s[x][i].val,opt=s[x][i].opt,dis=s[x][i].dis; if(val==1)continue; if(opt==0){ c[0][dep[v]]+=val; if(dep[x]+a[x]==dep[v])ans[0][x]--; } else{ c[1][dep[v]-dis+N]+=val; } } } int main() { scanf("%d%d",&n,&m); for(int i=1,x,y;i<n;i++){ scanf("%d%d",&x,&y); add(x,y),add(y,x); } for(int i=1;i<=n;i++)scanf("%d",&a[i]); dfs(1,0); for(int i=1,x,y;i<=m;i++){ scanf("%d%d",&x,&y); int lca=get(x,y); int dis=dep[x]+dep[y]-2*dep[lca]; s[x].push_back(node(0,1,x,0)); s[y].push_back(node(1,1,y,dis)); s[lca].push_back(node(0,-1,x,0)); s[lca].push_back(node(1,-1,y,dis)); } dfs1(1,0); for(int i=1;i<=n;i++){ printf("%d ",ans[0][i]+ans[1][i]); } return 0; }
原文地址:https://www.cnblogs.com/chloris/p/11861140.html
- Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
- [Android] Toast问题深度剖析(二)
- [Android] Toast问题深度剖析(一)
- android离线缓存技术
- 浅谈ViewModel
- Android深入理解JNI(二)类型转换、方法签名和JNIEnv
- 探讨通过Feign配合Hystrix进行调用时异常的处理
- 小窗播放视频的原理和实现(上)
- 一种Android App在Native层动态加载so库的方案
- java的双缓冲技术
- application之OnLowMemory()和 OnTrimMemory(level)讲解
- React Native组件(一)组件的生命周期
- Spring Cloud构建微服务架构:服务消费(基础)【Dalston版】
- Android解析ClassLoader(一)Java中的ClassLoader
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP调用全国天气预报数据接口查询天气示例
- Python使用itcaht库实现微信自动收发消息功能
- Laravel源码解析之路由的使用和示例详解
- PHP实现的用户注册表单验证功能简单示例
- php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
- 微信企业转账之入口类分装php代码
- python输出结果刷新及进度条的实现操作
- PHP实现微信申请退款功能
- python 读取.nii格式图像实例
- PHP实现八皇后算法
- 浅析php如何实现爬取数据原理
- Python 存取npy格式数据实例
- 微信支付之JSAPI公众号支付详解
- 浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
- Python代码执行时间测量模块timeit用法解析