[NoiPlus2016]天天爱跑步
巨坑
树剖学的好啊!---sfailsth
把一段路径拆成两段,向上和S->LCA,向下LCA->T
用维护重链什么的操作搞一下。
sfailsth学长真不容易啊。。。考场上rush了4.58KB代码。。。。
常数巨大懒得优化,最慢一个点1528ms/128703KB,Orz
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
const int N=600000;
int read() {
int ret=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){ret*=10;ret+=ch-'0';ch=getchar();}
return ret*f;
}
struct Edge {
int to,nxt;
}e[N];
struct Peo {
int s,t,lca;
} p[N];
int n,m,w[N],top[N],dfn1[N],son[N],siz[N],dep[N],fa[N],tim,dfn2[N],f[N],rnk[N],ans[N],s[N],head[N],ecnt;
void add(int bg,int ed){e[++ecnt].nxt=head[bg];e[ecnt].to=ed;head[bg]=ecnt;}
bool vis[N];
int find(int x) {
return x==f[x]?x:f[x]=find(f[x]);
}
vector<int>Q[N],ID[N],S[N],T[N];
void dfs1(int x) {
siz[x]=1;
for(int i=head[x]; i; i=e[i].nxt) {
int v=e[i].to;
if(v==fa[x])continue;
fa[v]=x;
dep[v]=dep[x]+1;
dfs1(v);
siz[x]+=siz[v];
if(siz[v]>siz[son[x]]) son[x]=v;
}
}
void dfs2(int x,int qtop) {
dfn1[x]=++tim;
top[x]=qtop;
rnk[tim]=x;
if(son[x]) dfs2(son[x],qtop);
for(int i=head[x]; i; i=e[i].nxt) {
int v=e[i].to;
if(v==fa[x]||v==son[x]) continue;
dfs2(v,v);
}
dfn2[x]=tim;
}
void dfs3(int x) {
f[x]=x;
vis[x]=1;
for(int i=0; i<Q[x].size(); i++)
if(vis[Q[x][i]])
p[ID[x][i]].lca=find(Q[x][i]);
for(int i=head[x]; i; i=e[i].nxt)
if(fa[x]!=e[i].to)
dfs3(e[i].to),f[e[i].to]=x;
return;
}
void add(int x,int y,int depth) {
if(dep[x]<dep[y]) swap(x,y);
while(top[x]!=top[y]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
S[dfn1[top[x]]].push_back(depth);
T[dfn1[x]+1].push_back(depth);
x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
S[dfn1[y]].push_back(depth);
T[dfn1[x]+1].push_back(depth);
}
void calc1() {
for(int i=1; i<=n; i++) w[i]-=dep[i];
for(int i=1; i<=m; i++) {
int now=dep[p[i].s]-dep[p[i].lca];
if(w[p[i].lca]==now-dep[p[i].lca]) ans[p[i].lca]--;
add(p[i].lca,p[i].t,now-dep[p[i].lca]);
}
for(int i=1; i<=n; i++) {
for(int j=0; j<S[i].size(); j++)
s[S[i][j]]++;
for(int j=0; j<T[i].size(); j++)
s[T[i][j]]--;
ans[rnk[i]]+=s[w[rnk[i]]];
}
}
void calc2() {
for(int i=0; i<=n; i++) S[i].clear(),T[i].clear();
memset(s,0,sizeof s);
for(int i=1; i<=n; i++) w[i]+=dep[i]<<1;
for(int i=1; i<=m; i++)
add(p[i].lca,p[i].s,dep[p[i].s]);
for(int i=1; i<=n; i++) {
for(int j=0; j<S[i].size(); j++) s[S[i][j]]++;
for(int j=0; j<T[i].size(); j++) s[T[i][j]]--;
ans[rnk[i]]+=s[w[rnk[i]]];
}
}
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();
for(int u,v,i=1; i<=m; i++) {
u=read(),v=read();
Q[u].push_back(v);
Q[v].push_back(u);
ID[u].push_back(i);
ID[v].push_back(i);
p[i].s=u;
p[i].t=v;
}
dfs1(1);
dfs2(1,1);
dfs3(1);
calc1();
calc2();
for(int i=1; i<=n; i++) printf("%d ",ans[i]);
}
[NoiPlus2016]天天爱跑步的更多相关文章
- UOJ261 【NOIP2016】天天爱跑步
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ4719 [Noip2016]天天爱跑步
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- noip2016天天爱跑步
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...
- bzoj 4719: [Noip2016]天天爱跑步
Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要 玩家每天按时上线,完成打卡任务.这个游戏的地图可以看作一一 ...
- [NOIP]2016天天爱跑步
[NOIP]2016天天爱跑步 标签: LCA 树上差分 NOIP Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...
- NOIP2016 天天爱跑步 80分暴力
https://www.luogu.org/problem/show?pid=1600 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养 ...
- [NOIp 2016]天天爱跑步
Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图 ...
- 【NOIP2016】【LCA】【树上差分】【史诗级难度】天天爱跑步
学弟不是说要出丧题吗>>所以我就研究了1天lca又研究了1天tj然后研究了一天天天爱跑步,终于写了出来.(最后的平均用时为240ms...比学弟快了1倍...) 题意:给你颗树,然后有m个 ...
- 【NOIP2016】天天爱跑步
题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 个结点 ...
随机推荐
- 听说”双11”是这么解决线上bug的
听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...
- C语言可变參实现參数累加返回
C语言可变參的作用真的是很大,自从发表了可变參怎样实现printf.fprintf,sprintf的文章以来.便有不少博友私信问我实现的机制,我也解释了相关的知识点.今天,我们借着这个机会,再来举一个 ...
- linux下select,poll,epoll的使用与重点分析
好久没用I/O复用了,感觉差点儿相同都快忘完了.记得当初刚学I/O复用的时候花了好多时间.可是因为那会不太爱写博客,导致花非常多时间搞明确的东西,依旧非常easy忘记.俗话说眼过千遍不如手过一遍,的确 ...
- FPGA 浮点单元设计
浮点数在内存中的存放格式例如以下: 地址 +0 +1 +2 +3 内容 SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM 这里 S 代表符号位,1是负,0是正 E 偏移1 ...
- Linux环境中Apache也就是httpd服务的启动,查看版本等操作
本机是虚拟机,装的redhat Linux版本,默认是安装了httpd的 打开terminal 切换到root用户 cd到/etc/rc.d/init.d/目录,并列出该目录下的所有文件,看看是否有h ...
- macOS10.9+xcode6编译ffmpeg2.4.2 for ios
近期须要用到ffmpeg开发视频相关.在网上找了些编译资源,自己摸索着,总算编译ok了. 因此,记录下苦逼的编译过程,已祭奠我为之逝去的青春. 1.准备工作 首先.到ffmpeg官网下载最新到代码. ...
- AES 加密位: 128位,加密模式:CBC, 填充模式:Zeros
// AES 加密 public byte[] AESEncrypt(string text) { byte[] data = Encoding.Unicode.GetBytes(text); Sym ...
- luogu2606 排列计数
题目大意 求满足下列条件的排列$P$的数量:$\forall P_i, P_i>P_{\lfloor \frac{i}{2}\rfloor}$. 思路 从下标入手 反过来想,也就是对$\fora ...
- BZOJ3172 单词 Fail树
题目大意:求一篇论文中每个单词分别在论文中出现多少次. 本题用AC自动机太慢,应该用Fail树将AC自动机中所有的Fail指针反向得到一个新树,这就是Fail树.对长度为x的字符串a和长度为y的字符串 ...
- Connect the Cities--hdoj
Connect the Cities Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...