巨坑

树剖学的好啊!---sfailsth

把一段路径拆成两段,向上和S->LCA,向下LCA->T

用维护重链什么的操作搞一下。

sfailsth学长真不容易啊。。。考场上rush了4.58KB代码。。。。

常数巨大懒得优化,最慢一个点1528ms/128703KB,Orz

  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4. #include <cstdio>
  5. using namespace std;
  6. const int N=600000;
  7. int read() {
  8. int ret=0,f=1; char ch=getchar();
  9. while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
  10. while (ch>='0'&&ch<='9'){ret*=10;ret+=ch-'0';ch=getchar();}
  11. return ret*f;
  12. }
  13. struct Edge {
  14. int to,nxt;
  15. }e[N];
  16. struct Peo {
  17. int s,t,lca;
  18. } p[N];
  19. 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;
  20. void add(int bg,int ed){e[++ecnt].nxt=head[bg];e[ecnt].to=ed;head[bg]=ecnt;}
  21. bool vis[N];
  22. int find(int x) {
  23. return x==f[x]?x:f[x]=find(f[x]);
  24. }
  25. vector<int>Q[N],ID[N],S[N],T[N];
  26. void dfs1(int x) {
  27. siz[x]=1;
  28. for(int i=head[x]; i; i=e[i].nxt) {
  29. int v=e[i].to;
  30. if(v==fa[x])continue;
  31. fa[v]=x;
  32. dep[v]=dep[x]+1;
  33. dfs1(v);
  34. siz[x]+=siz[v];
  35. if(siz[v]>siz[son[x]]) son[x]=v;
  36. }
  37. }
  38. void dfs2(int x,int qtop) {
  39. dfn1[x]=++tim;
  40. top[x]=qtop;
  41. rnk[tim]=x;
  42. if(son[x]) dfs2(son[x],qtop);
  43. for(int i=head[x]; i; i=e[i].nxt) {
  44. int v=e[i].to;
  45. if(v==fa[x]||v==son[x]) continue;
  46. dfs2(v,v);
  47. }
  48. dfn2[x]=tim;
  49. }
  50. void dfs3(int x) {
  51. f[x]=x;
  52. vis[x]=1;
  53. for(int i=0; i<Q[x].size(); i++)
  54. if(vis[Q[x][i]])
  55. p[ID[x][i]].lca=find(Q[x][i]);
  56. for(int i=head[x]; i; i=e[i].nxt)
  57. if(fa[x]!=e[i].to)
  58. dfs3(e[i].to),f[e[i].to]=x;
  59. return;
  60. }
  61. void add(int x,int y,int depth) {
  62. if(dep[x]<dep[y]) swap(x,y);
  63. while(top[x]!=top[y]) {
  64. if(dep[top[x]]<dep[top[y]]) swap(x,y);
  65. S[dfn1[top[x]]].push_back(depth);
  66. T[dfn1[x]+1].push_back(depth);
  67. x=fa[top[x]];
  68. }
  69. if(dep[x]<dep[y])swap(x,y);
  70. S[dfn1[y]].push_back(depth);
  71. T[dfn1[x]+1].push_back(depth);
  72. }
  73. void calc1() {
  74. for(int i=1; i<=n; i++) w[i]-=dep[i];
  75. for(int i=1; i<=m; i++) {
  76. int now=dep[p[i].s]-dep[p[i].lca];
  77. if(w[p[i].lca]==now-dep[p[i].lca]) ans[p[i].lca]--;
  78. add(p[i].lca,p[i].t,now-dep[p[i].lca]);
  79. }
  80. for(int i=1; i<=n; i++) {
  81. for(int j=0; j<S[i].size(); j++)
  82. s[S[i][j]]++;
  83. for(int j=0; j<T[i].size(); j++)
  84. s[T[i][j]]--;
  85. ans[rnk[i]]+=s[w[rnk[i]]];
  86. }
  87. }
  88. void calc2() {
  89. for(int i=0; i<=n; i++) S[i].clear(),T[i].clear();
  90. memset(s,0,sizeof s);
  91. for(int i=1; i<=n; i++) w[i]+=dep[i]<<1;
  92. for(int i=1; i<=m; i++)
  93. add(p[i].lca,p[i].s,dep[p[i].s]);
  94. for(int i=1; i<=n; i++) {
  95. for(int j=0; j<S[i].size(); j++) s[S[i][j]]++;
  96. for(int j=0; j<T[i].size(); j++) s[T[i][j]]--;
  97. ans[rnk[i]]+=s[w[rnk[i]]];
  98. }
  99. }
  100. int main() {
  101. n=read(),m=read();
  102. for(int i=1,u,v; i<n; i++)
  103. u=read(),v=read(),add(u,v),add(v,u);
  104. for(int i=1; i<=n; i++)
  105. w[i]=read();
  106. for(int u,v,i=1; i<=m; i++) {
  107. u=read(),v=read();
  108. Q[u].push_back(v);
  109. Q[v].push_back(u);
  110. ID[u].push_back(i);
  111. ID[v].push_back(i);
  112. p[i].s=u;
  113. p[i].t=v;
  114. }
  115. dfs1(1);
  116. dfs2(1,1);
  117. dfs3(1);
  118. calc1();
  119. calc2();
  120. for(int i=1; i<=n; i++) printf("%d ",ans[i]);
  121. }

[NoiPlus2016]天天爱跑步的更多相关文章

  1. UOJ261 【NOIP2016】天天爱跑步

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  2. BZOJ4719 [Noip2016]天天爱跑步

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. noip2016天天爱跑步

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

  4. bzoj 4719: [Noip2016]天天爱跑步

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

  5. [NOIP]2016天天爱跑步

    [NOIP]2016天天爱跑步 标签: LCA 树上差分 NOIP Description 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...

  6. NOIP2016 天天爱跑步 80分暴力

    https://www.luogu.org/problem/show?pid=1600 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养 ...

  7. [NOIp 2016]天天爱跑步

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

  8. 【NOIP2016】【LCA】【树上差分】【史诗级难度】天天爱跑步

    学弟不是说要出丧题吗>>所以我就研究了1天lca又研究了1天tj然后研究了一天天天爱跑步,终于写了出来.(最后的平均用时为240ms...比学弟快了1倍...) 题意:给你颗树,然后有m个 ...

  9. 【NOIP2016】天天爱跑步

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

随机推荐

  1. [bzoj1552\bzoj2506][Cqoi2014]robotic sort 排序机械臂_非旋转Treap

    robotic sort 排序机械臂 bzoj-1552 bzoj-2506 Cqoi-2014 题目大意:给定一个序列,让你从1到n,每次将[1,p[i]]这段区间反转,p[i]表示整个物品权值第i ...

  2. [bzoj2600][Ioi2011]ricehub_二分

    ricehub bzoj-2600 Ioi-2011 题目大意:在数轴上有r块稻田,稻田坐标为整数.计划建造一个米仓,使得它可以收取尽量多的稻米.米仓的坐标仍需为整数.每一块权值为val的稻田距离米仓 ...

  3. sendfile学习

    参考 https://zhuanlan.zhihu.com/p/20768200?refer=auxten 而成本很多时候的体现就是对计算资源的消耗,其中最重要的一个资源就是CPU资源. Sendfi ...

  4. 刚開始学习的人非常有用:struts2中将jsp数据传到action的几种方式

    先给上struts.xml代码: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE strut ...

  5. 产生冠军--hdoj

    产生冠军 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  6. Intellij IDEA社区版打包Maven项目成war包,并部署到tomcat上

    转自:https://blog.csdn.net/yums467/article/details/51660683 需求分析 我们利用 Intellij idea社区版IDE开发了一个maven的sp ...

  7. JavaScript之BOM和DOM

    前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...

  8. nfs server and client

    系统环境:Centos7.3 ip1:10.0.0.1 ip2:10.0.0.2 检测是否安装NFS服务 rpm -qa | grep   nfs rpm  -qa|grep    nfs 安装NFS ...

  9. myslide探索

    最近查一些国内学术牛人的报告时,注意到myslide是个很好的平台,比如山大一个老师的报告,完全可以在上面看到 https://myslide.cn/slides/10774 又比如交大一个大牛老师关 ...

  10. Spring 获取propertise文件中的值

    Spring 获取propertise文件中的值 Spring 获取propertise的方式,除了之前的博文提到的使用@value的注解注入之外,还可以通过编码的方式获取,这里主要说的是要使用Emb ...