题面传送门
这道题目蛮好的。
首先暴力不可取,会TTT
考虑分类讨论,把一段路径分为上行与下行。
设dxd_xdx​为xxx节点的深度,则在上行时被观察到当且仅当dv+tv=dud_v+t_v=d_udv​+tv​=du​,下行也可推出当且仅当dv−tv=dud_v-t_v=d_udv​−tv​=du​
那么直接在树上差分哪一段有贡献。
求答案就是在子树内找与那个数相同的点的个数就好了。应该都会吧开桶记录即可。
代码实现:

#include<cstdio>
#include<cstring>
using namespace std;
int n,m,k,d[300039],lg[300039],fa[300039][20],ans[300039],g[300039],f[600039],lcas,x,y,z;
struct yyy{int to,z;};
struct ljb{int head,h[300039];yyy f[600039];inline void add(int x,int y){f[++head]=(yyy){y,h[x]};h[x]=head;}
}s,a,b;
inline void dfs1(int x,int last){d[x]=d[last]+1;fa[x][0]=last;for(int i=1;i<=lg[d[x]];i++) fa[x][i]=fa[fa[x][i-1]][i-1];int cur=s.h[x];yyy tmp;while(cur!=-1){tmp=s.f[cur];if(tmp.to!=last) dfs1(tmp.to,x);cur=tmp.z;}
}
inline void swap(int &x,int &y){x^=y,y^=x,x^=y;}
inline int lca(int x,int y){if(d[x]<d[y])swap(x,y);while(d[x]>d[y]) x=fa[x][lg[d[x]-d[y]]-1];if(x==y) return x;for(int i=lg[d[x]]-1;i>=0;i--) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];return fa[x][0];
}
inline void dfs2(int x){int ans1=f[d[x]+g[x]+n],ans2=f[d[x]-g[x]+n],cur=a.h[x];yyy tmp;while(cur!=-1){tmp=a.f[cur];f[tmp.to+n]++;cur=tmp.z;}cur=b.h[x];while(cur!=-1){tmp=b.f[cur];f[tmp.to+n]--;cur=tmp.z;}cur=s.h[x];while(cur!=-1){tmp=s.f[cur];if(tmp.to!=fa[x][0]) dfs2(tmp.to);cur=tmp.z;}//printf("%d %d %d %d %d\n",x,ans1,f[d[x]+g[x]+n],ans2,f[d[x]-g[x]+n]);if(!g[x]) ans[x]=f[d[x]+g[x]+n]-ans1;else ans[x]=f[d[x]+g[x]+n]-ans1+f[d[x]-g[x]+n]-ans2;
}
inline void read(int &x){char s=getchar();x=0;while(s<'0'||s>'9') s=getchar();while(s>='0'&&s<='9') x=(x<<3)+(x<<1)+(s^48),s=getchar();
}
inline void print(int x){if(x>9) print(x/10);putchar(x%10+48);
}
int main(){register int i;memset(b.h,-1,sizeof(b.h));memset(a.h,-1,sizeof(a.h));memset(s.h,-1,sizeof(s.h));read(n);read(m);for(i=1;i<=n;i++) lg[i]=lg[i-1]+(1<<lg[i-1]==i);for(i=1;i<n;i++) read(x),read(y),s.add(x,y),s.add(y,x);dfs1(1,0);for(i=1;i<=n;i++) read(g[i]);for(i=1;i<=m;i++){read(x);read(y);lcas=lca(x,y);a.add(x,d[x]);b.add(fa[lcas][0],d[x]);a.add(y,d[lcas]*2-d[x]);b.add(lcas,d[lcas]*2-d[x]);}dfs2(1);for(i=1;i<=n;i++) print(ans[i]),putchar(' ');
}

luogu P1600 天天爱跑步相关推荐

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

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

  2. P1600 天天爱跑步

    P1600 天天爱跑步 题目描述 详见:P1600 天天爱跑步 Solution 树上差分+LCA. Code #include<bits/stdc++.h> using namespac ...

  3. [FROM LUOGU]P1600 【NOIP2016DAY1T2】天天爱跑步

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

  4. luoguP1600 天天爱跑步(NOIP2016)(主席树+树链剖分)

    阅读体验: https://zybuluo.com/Junlier/note/1303550 为什么这一篇的Markdown炸了? # 天天爱跑步题解(Noip2016)(桶+树上差分 ^ 树剖+主席 ...

  5. 【洛谷】1600:天天爱跑步【LCA】【开桶】【容斥】【推式子】

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

  6. NOIP2016·洛谷·天天爱跑步

    初见安~这里是传送门:洛谷P1600 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打 ...

  7. BZOJ 4719: [Noip2016]天天爱跑步 线段树合并

    title BZOJ 4719 LUOGU 1600 简化题意: 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每 ...

  8. NOIP2016天天爱跑步

    NOIP2016天天爱跑步 这题一看显然lca+树上差分,但是因为有w的限制不能直接加,所以考虑权值线段树合并, 每个选手的起点终点对于不同的节点的影响是不同的,这就非常麻烦了,但是可以发现无论如何他 ...

  9. Noip2016day1 天天爱跑步running

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

最新文章

  1. 深度研报:六大视角解读人工智能,AI岂止于技术
  2. 中段尾段全段什么意思_头段?中尾段?还是全段?只要排气改对,还怕撩不到妹?...
  3. 【组合数学】递推方程 ( 常系数线性非齐次递推方程求解 | 递推方程标准型及通解 | 递推方程通解证明 )
  4. hdu 5285(染色法判断二分图)
  5. oracle10g 6.0更改5.2,Oracle 10G 10.2.0.1升级到10.2.0.5
  6. javadoc文档的生成方法_[springboot 开发单体web shop] 4. Swagger生成Javadoc
  7. MYSQL启动后报:ERROR! The server quit without updating PID file错误的问题解决
  8. Exchange Server 2016 之三:邮箱角色部署
  9. Spring入门看这一篇就够了
  10. Python nose测试工具报ImportError: No Module named 错误
  11. Java后台开发学习进阶路线
  12. yabailv 运放_运放的压摆率PCB技术文章PCB联盟网 - Powered by Discuz!
  13. IOS中怎么使用微软雅黑字体
  14. 3461. 在哈尔滨的寒风中(找规律)
  15. ndis协议驱动开发
  16. 小小英雄怎么修改服务器,英雄联盟自走棋小小英雄怎么换 LOL英雄战棋小小英雄皮肤更改方法...
  17. javascript百炼成仙 第一章 掌握JavaScript基础 1.12 JavaScript运算符
  18. 笔记本重新启动计算机,电脑正在重新启动很久了怎么办
  19. platEMO里多目标进化算法对应的参考文献
  20. 【花雕动手做】有趣好玩的音乐可视化系列项目(28)--LED乒乓球灯

热门文章

  1. web前端之——图片上传
  2. 如何使用计算机隐藏功能,Win7系统25个隐蔽功能使用方法
  3. 表达式的操作(UF函数)
  4. 【LeetCode Python实现】908. 最小差值 I(简单)
  5. 为什么开直通车后搜索上不来?手淘压制搜索如何解决?
  6. LaTeX中正规子群符号的输入方法
  7. 作为程序员的你在外行人眼里是一个怎样的群体?
  8. 大华nvr服务器返回消息错误,GB/T28181协议EasyGBS问题解决对接大华硬盘录像机NVR时查询录像失败...
  9. 2021手游排行前十名分享
  10. Chino with Equation (隔板法+除法取模)