号称是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天天爱跑步的更多相关文章

  1. [NOIP2016 DAY1 T2]天天爱跑步-[差分+线段树合并][解题报告]

    [NOIP2016 DAY1 T2]天天爱跑步 题面: B[NOIP2016 DAY1]天天爱跑步 时间限制 : - MS 空间限制 : 565536 KB 评测说明 : 2s Description ...

  2. NOIP2016 DAY1 T2天天爱跑步

    传送门 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 ...

  3. NOIP2016 Day1 T2 天天爱跑步(树上差分,LCA)

    原文链接 原题链接 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏 ...

  4. 【NOIP2016】DAY1 T2 天天爱跑步

    [NOIP2016]DAY1 T2 天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时 ...

  5. 【NOIP 2016】Day1 T2 天天爱跑步

    Problem Description 小 C 同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任 ...

  6. P1600 [NOIP2016 提高组] 天天爱跑步 (树上差分)

    对于一条路径,s-t,位于该路径上的观察员能观察到运动员当且仅当以下两种情况成立:(d[ ]表示节点深度) 1.观察员x在s-lca(s,t)上时,满足d[s]=d[x]+w[x]就能观察到,所以我们 ...

  7. 【NOIP2016 Day1 T2】天天爱跑步

    题目传送门:https://www.luogu.org/problemnew/show/P1600 感觉这两天在处理边界问题上有点神志不清......为了从80的暴力变成100,花了整整一个下午+一个 ...

  8. [NOIp2016提高组]天天爱跑步

    题目大意: 有一棵n个点的树,每个点上有一个摄像头会在第w[i]秒拍照. 有m个人再树上跑,第i个人沿着s[i]到t[i]的路径跑,每秒钟跑一条边. 跑到t[i]的下一秒,人就会消失. 问每个摄像头会 ...

  9. [luogu]P1600 天天爱跑步[LCA]

    [luogu]P1600 [NOIP 2016]天天爱跑步 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上 ...

随机推荐

  1. 小程序日期格式(yyyy-MM-dd HH:mm:ss)转(yyyy/MM/dd HH:mm:ss)

    let newDate = (date).replace(/-/g, '/'); var date = new Date(newDate).getTime();

  2. P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here

    输入格式: 第1行:一个长度为111到666的大写字母串,表示彗星的名字. 第2行:一个长度为111到666的大写字母串,表示队伍的名字. 输出格式: 如果能搭配,就输出“GO”,否则输出“STAY” ...

  3. Charles中文破解版下载安装及使用教程

    下载地址:https://pan.baidu.com/s/1praYZAw23psZLi59hKJjqw 一. 简介及安装 Charles 是在 PC 端常用的网络封包截取工具,但它不仅仅能在pc端使 ...

  4. Marked

    哈夫曼树 2-sat问题 线性代数基础 矩阵和行列式基础 可并堆1 可并堆2 概率与期望概念 Kruskcl重构树1 Kruskcl重构树2 匈牙利算法 带权并查集 C++参考手册 尺取法 AC自动机 ...

  5. JVM-GC算法(二)-复制算法&&标记整理算法

    这次我和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一篇在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算法 ...

  6. JAVA开发框架

    1.Bootstrap     Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍 ...

  7. (四)C语言之函数

  8. js第一次学习心得

    最近开始接触js,用的是阮一峰的菜鸟教程,相对来说我觉得是比较通俗易懂的,用了很多很小的例子去讲每一个很小的细节,但对于我这种因为即将到来的团队作业做准备的,也没有办法将每个细节都理解的清楚,主要的把 ...

  9. 一、基础篇--1.2Java集合-HashMap和HashTable的区别

    HashMap和HashTable的区别 1.继承的父类不同,HashMap继承的是AbstractMap类,HashTable继承的是Dictionary类,不过都实现了Map.Clone.Seri ...

  10. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_7 获取Servlet原生的API

    控制器里面获取常用的request对象或者Response对象. 想拿到谁, 就在参数上写上谁 再获取servletConetext并输出