Luogu P1600[NOIP2016]day1 T2天天爱跑步
号称是noip2016最恶心的题
基本上用了一天来搞明白+给sy讲明白(可能还没讲明白
具体思路是真的不想写了(快吐了
如果要看,参见洛谷P1600 天天爱跑步——题解
虽然这样不好但我真的不想写了
直接放代码:
#include<bits/stdc++.h>
#include<vector>
using namespace std;
inline int read() {
int ans=0;
char last=' ',ch=getchar();
while(ch>'9'||ch<'0') last=ch,ch=getchar();
while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
if(last=='-') ans=-ans;
return ans;
}
const int mxn=300000;
int n,m;
vector<int> lcau[mxn],len[mxn];
struct nd{
int i,v;
};
vector<nd> lcav[mxn];
int dis[mxn];
struct node {
int to,nxt;
}e[mxn<<1];
int w[mxn];
int ans[mxn];
int ecnt,head[mxn];
void add(int from,int to) {
++ecnt;
e[ecnt].to=to;
e[ecnt].nxt=head[from];
head[from]=ecnt;
}
int dep[mxn],fa[mxn],siz[mxn],son[mxn],top[mxn];
void dfs1(int u,int f) {
dep[u]=dep[f]+1;
fa[u]=f;
siz[u]=1;
int maxn=-1;
for(int i=head[u],v;i;i=e[i].nxt) {
v=e[i].to;
if(v==f) continue;
dfs1(v,u);
siz[u]+=siz[v];
if(maxn<siz[v]) {
maxn=siz[v];
son[u]=v;
}
}
}
void dfs2(int u,int f) {
if(son[f]==u) top[u]=top[f];
else top[u]=u;
if(son[u]) dfs2(son[u],u);
for(int i=head[u],v;i;i=e[i].nxt) {
v=e[i].to;
if(v==f||v==son[u]) continue;
dfs2(v,u);
}
}
int lca(int x,int y) {
while(top[x]!=top[y]) {
if(dep[top[x]]>dep[top[y]]) x=fa[top[x]];
else y=fa[top[y]];
}
if(x==y) return x;
if(dep[x]>dep[y]) swap(x,y);
return x;
}
int t1[mxn],t2[mxn<<1];
int st[mxn];
void dfs(int u) {
int bf=t1[dep[u]+w[u]]+t2[w[u]-dep[u]+mxn];
for(int i=head[u],v;i;i=e[i].nxt) {
v=e[i].to;
if(v==fa[u]) continue;
dfs(v);
}
if(st[u])
t1[dep[u]]+=st[u];
if(len[u].size())
for(int i=0;i<len[u].size();i++) {
int Dis=len[u][i];
t2[Dis-dep[u]+mxn]++;
}
ans[u]=t1[dep[u]+w[u]]+t2[w[u]-dep[u]+mxn]-bf;
if(lcau[u].size()) {
for(int i=0;i<lcau[u].size();i++) {
int start=lcau[u][i];
int enddd=lcav[u][i].v;
int num=lcav[u][i].i;
if(dep[u]+w[u]==dep[start]&&dis[num]-dep[enddd]+dep[u]==w[u])
ans[u]--;
t1[dep[start]]--;
t2[dis[num]-dep[enddd]+mxn]--;
}
}
}
int main() {
n=read();
m=read();
for(int i=1,u,v;i<n;i++) {
u=read();
v=read();
add(u,v);
add(v,u);
}
for(int i=1;i<=n;i++)
w[i]=read();
int l;
dfs1(1,0);
dfs2(1,0);
for(int i=1,S,T;i<=m;i++) {
S=read();
T=read();
st[S]++;
int f=lca(S,T);
lcau[f].push_back(S);
lcav[f].push_back(nd{i,T});
dis[i]=dep[S]+dep[T]-(dep[f]<<1);
len[T].push_back(dis[i]);
}
dfs(1);
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
return 0;
}
Luogu P1600[NOIP2016]day1 T2天天爱跑步的更多相关文章
- [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]
[NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...
- NOIP2016 DAY1 T2天天爱跑步
传送门 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 ...
- NOIP2016 Day1 T2 天天爱跑步(树上差分,LCA)
原文链接 原题链接 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏 ...
- 【NOIP2016】DAY1 T2 天天爱跑步
[NOIP2016]DAY1 T2 天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时 ...
- 【NOIP 2016】Day1 T2 天天爱跑步
Problem Description 小 C 同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任 ...
- P1600 [NOIP2016 提高组] 天天爱跑步 (树上差分)
对于一条路径,s-t,位于该路径上的观察员能观察到运动员当且仅当以下两种情况成立:(d[ ]表示节点深度) 1.观察员x在s-lca(s,t)上时,满足d[s]=d[x]+w[x]就能观察到,所以我们 ...
- 【NOIP2016 Day1 T2】天天爱跑步
题目传送门:https://www.luogu.org/problemnew/show/P1600 感觉这两天在处理边界问题上有点神志不清......为了从80的暴力变成100,花了整整一个下午+一个 ...
- [NOIp2016提高组]天天爱跑步
题目大意: 有一棵n个点的树,每个点上有一个摄像头会在第w[i]秒拍照. 有m个人再树上跑,第i个人沿着s[i]到t[i]的路径跑,每秒钟跑一条边. 跑到t[i]的下一秒,人就会消失. 问每个摄像头会 ...
- [luogu]P1600 天天爱跑步[LCA]
[luogu]P1600 [NOIP 2016]天天爱跑步 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上 ...
随机推荐
- (编程语言+python+变量名+垃圾回收机制)*知识点
编程语言 从低级到高级的发展的过程 1.机器语言 计算机是基于电工作的.(基于高.低电平 1010010101011) 如果用机器语言表现一个字符的意思需要多段代码的行.但是计算机读取的快. 所以机器 ...
- 学习andriod开发之 异步加载图片(二)--- 使用其他进度条
大家好 我是akira上一节 我们讲到使用AsyncTask 这个类进行异步的下载 主要是涉及到一些图片的更新 这次我们继续上一个demo的改进 . 不知道你是否发现一个问题 上一节我们遗留了两个bu ...
- JVM之Java类加载机制
什么是类加载机制 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这既是虚拟机的类加载机制 类的生命周期 生命周期简述 ...
- 第六天-css基础(css定位)
css定位 方位名称: left right top bottom position:absolute 绝对定位(脱离标准流 div{ width:100px; height:100p ...
- 性能指标:TPS 并发数 响应时间 QPS
响应时间(RT)reponse time指系统对请求作出响应的时间.一般关注平均响应时间和最大响应时间.对于单机没有并发操作的应用系统而言,普遍认为响应时间是一个合理且准确的性能指标,但响应时间并不能 ...
- log4j 多进程配置要注意的
多进程写日志文件 方法一: 解决log4j公用配置文件,多进程同时写同一个log文件,因存在操作系统pv操作问题, 导致部分日志丢失.解决方案是不同的进程写不同的log文件 测试于:Log4j 1.2 ...
- Python 之 subprocess模块
一.subprocess以及常用的封装函数运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序.在Python ...
- spark streaming 6: BlockGenerator、RateLimiter
BlockGenerator和RateLimiter其实很简单,但是它包含了几个很重要的属性配置的处理,所以记录一下. ))) , SECONDS) From WizNote
- [Java]手动构建SQL语法树(sql简单无嵌套)并输出与之对应的SQL语句之二
Entry入口 main中自顶向下手动创建了sql语法树 package com.hy; // 构建SQL语法树 public class Entry { public static void mai ...
- Mac下制作openwrt U盘启动盘
华硕路由用腻了,正好家里有老旧淘汰的电脑,那么非常适合折腾一下OpenWrt,科学上网靠自己. 什么是OpenWrt:OpenWrt是适合于嵌入式设备的一个Linux发行版. 参考资料:https:/ ...