Housewife Wind

参考博客:POJ2763 Housewife Wind(树剖+线段树)

差不多是直接套线段树+树剖的板子,但是也有一些需要注意的地方

建树:

  1. void build()
  2. {
  3. for( int i=1;i<n;++i)
  4. {
  5. if(dep[e[i][1]]<dep[e[i][0]]) swap(e[i][1],e[i][0]);
  6. update(id[e[i][1]],1,n-1,e[i][2],1);
  7. }
  8. }

单点更新(令某个点为 k,而不是加 k):

  1. void update(int x,int s,int t,int k,int p)
  2. {
  3. if(s==t)
  4. {
  5. d[p]=k;return ;
  6. }
  7. int m=(s+t)>>1;
  8. if(x<=m) update(x,s,m,k,lson);
  9. else update(x,m+1,t,k,rson);
  10. d[p]=d[lson]+d[rson];
  11. }

线段树区间求和:

  1. int getsum(int l,int r,int s,int t,int p)
  2. {
  3. if(l>r) return 0; //记得加上这个,不然会re
  4. if(l<=s&&t<=r) return d[p];
  5. int m=(s+t)>>1;
  6. ll sum=0;
  7. if(l<=m) sum+=getsum(l,r,s,m,lson);
  8. if(r>m) sum+=getsum(l,r,m+1,t,rson);
  9. return sum;
  10. }

树剖区间求和:

  1. int query(int x,int y)
  2. {
  3. ll ans=0;
  4. if(x==y) return 0;
  5. while(top[x]!=top[y])
  6. {
  7. if(dep[top[x]]<dep[top[y]]) swap(x,y);
  8. ans+=getsum(id[top[x]],id[x],1,n-1,1);
  9. x=f[top[x]];
  10. }
  11. if(dep[x]>dep[y]) swap(x,y);
  12. ans+=getsum(id[son[x]],id[y],1,n-1,1); //要记住是son[x]的id到y的id
  13. return ans;
  14. }

代码:

  1. // Created by CAD on 2019/8/13.
  2. #include <algorithm>
  3. #include <cstdio>
  4. #define lson (p<<1)
  5. #define rson ((p<<1)|1)
  6. using namespace std;
  7. #define ll long long
  8. const int maxn=2e5+5;
  9. int dep[maxn],top[maxn],son[maxn],f[maxn],siz[maxn],tot;
  10. int id[maxn],cnt,head[maxn],nxt[maxn],to[maxn];
  11. int d[maxn<<1],n,e[maxn][3];
  12. inline int read() {
  13. int x = 0, w = 1;
  14. char ch = 0;
  15. while (ch < '0' || ch > '9') {
  16. if (ch == '-') w = -1;
  17. ch = getchar();
  18. }
  19. while (ch >= '0' && ch <= '9') {
  20. x = x * 10 + (ch - '0');
  21. ch = getchar();
  22. }
  23. return x * w;
  24. }
  25. inline void write(int x) {
  26. static int sta[35];
  27. int top = 0;
  28. do {
  29. sta[top++] = x % 10, x /= 10;
  30. } while (x);
  31. while (top) putchar(sta[--top] + 48);
  32. putchar('\n');
  33. }
  34. void add(int u,int v)
  35. {
  36. nxt[++cnt]=head[u];
  37. head[u]=cnt;
  38. to[cnt]=v;
  39. }
  40. void dfs1(int u,int fa)
  41. {
  42. f[u]=fa;dep[u]=dep[fa]+1;siz[u]=1;
  43. int maxson=-1;
  44. for( int i=head[u];i;i=nxt[i])
  45. {
  46. int v=to[i];if(v==fa) continue;
  47. dfs1(v,u);siz[u]+=siz[v];
  48. if(siz[v]>maxson) maxson=siz[v],son[u]=v;
  49. }
  50. }
  51. void dfs2(int u,int Top)
  52. {
  53. top[u]=Top;id[u]=tot++;
  54. if(!son[u]) return ;
  55. dfs2(son[u],Top);
  56. for( int i=head[u];i;i=nxt[i])
  57. {
  58. int v=to[i];
  59. if(v==f[u]||v==son[u]) continue;
  60. dfs2(v,v);
  61. }
  62. }
  63. void update(int x,int s,int t,int k,int p)
  64. {
  65. if(s==t)
  66. {
  67. d[p]=k;return ;
  68. }
  69. int m=(s+t)>>1;
  70. if(x<=m) update(x,s,m,k,lson);
  71. else update(x,m+1,t,k,rson);
  72. d[p]=d[lson]+d[rson];
  73. }
  74. int getsum(int l,int r,int s,int t,int p)
  75. {
  76. if(l>r) return 0;
  77. if(l<=s&&t<=r) return d[p];
  78. int m=(s+t)>>1;
  79. ll sum=0;
  80. if(l<=m) sum+=getsum(l,r,s,m,lson);
  81. if(r>m) sum+=getsum(l,r,m+1,t,rson);
  82. return sum;
  83. }
  84. void build()
  85. {
  86. for( int i=1;i<n;++i)
  87. {
  88. if(dep[e[i][1]]<dep[e[i][0]]) swap(e[i][1],e[i][0]);
  89. update(id[e[i][1]],1,n-1,e[i][2],1);
  90. }
  91. }
  92. int query(int x,int y)
  93. {
  94. ll ans=0;
  95. if(x==y) return 0;
  96. while(top[x]!=top[y])
  97. {
  98. if(dep[top[x]]<dep[top[y]]) swap(x,y);
  99. ans+=getsum(id[top[x]],id[x],1,n-1,1);
  100. x=f[top[x]];
  101. }
  102. if(dep[x]>dep[y]) swap(x,y);
  103. ans+=getsum(id[son[x]],id[y],1,n-1,1);
  104. return ans;
  105. }
  106. int main()
  107. {
  108. int p,s;
  109. n=read(),p=read(),s=read();
  110. cnt=1,tot=0;
  111. for( int i=1;i<n;++i)
  112. {
  113. e[i][0]=read(),e[i][1]=read(),e[i][2]=read();
  114. add(e[i][0],e[i][1]),add(e[i][1],e[i][0]);
  115. }
  116. dfs1(1,0);dfs2(1,1);
  117. build();
  118. for( int i=1;i<=p;++i)
  119. {
  120. int op,x,y;
  121. op=read();
  122. if(op==0)
  123. x=read(),write(query(x,s)),s=x;
  124. else x=read(),y=read(),update(id[e[x][1]],1,n-1,y,1);
  125. }
  126. }

Housewife Wind的更多相关文章

  1. Housewife Wind(边权树链剖分)

    Housewife Wind http://poj.org/problem?id=2763 Time Limit: 4000MS   Memory Limit: 65536K Total Submis ...

  2. POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )

    POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...

  3. POJ 2763 Housewife Wind LCA转RMQ+时间戳+线段树成段更新

    题目来源:POJ 2763 Housewife Wind 题意:给你一棵树 2种操作0 x 求当前点到x的最短路 然后当前的位置为x; 1 i x 将第i条边的权值置为x 思路:树上两点u, v距离为 ...

  4. POJ 2763 Housewife Wind(树链剖分)(线段树单点修改)

    Housewife Wind Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 10378   Accepted: 2886 D ...

  5. POJ 2763 Housewife Wind(DFS序+LCA+树状数组)

    Housewife Wind Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 11419   Accepted: 3140 D ...

  6. AC日记——Housewife Wind poj 2763

    Language: Default Housewife Wind Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 10525 ...

  7. poj 2763 Housewife Wind(树链拆分)

    id=2763" target="_blank" style="">题目链接:poj 2763 Housewife Wind 题目大意:给定一棵 ...

  8. POJ2763 Housewife Wind 树链剖分 边权

    POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...

  9. B - Housewife Wind POJ - 2763 树剖+边权转化成点权

    B - Housewife Wind POJ - 2763 因为树剖+线段树只能解决点权问题,所以这种题目给了边权的一般要转化成点权. 知道这个以后这个题目就很简单了. 怎么转化呢,就把这个边权转化为 ...

随机推荐

  1. sublime集成MinGW,打造C/C++开发环境

    MinGW是是将GCC编译器和GNU Binutils移植到Win32平台下的产物,包括一系列头文件(Win32API).库和可执行文件.MinGW是从Cygwin(1.3.3版)基础上发展而来.GC ...

  2. Django基础之jQuery操作

    Django基础之jQuery操作 jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery.cookie.j ...

  3. c语言:<tchar.h>

    头文件“<tchar.h>”作用就是为了进行ASCII码和UNICODE(wide-character)码的头文件(该头文件由微软提供): 这样我们就可以使用TCHAR.H头文件中的定义的 ...

  4. 02 Linux常用基本命令(二)

    1.Linux的文件系统格式 1.以 / 为根目录,成树状结构分布 2.查看根目录下有什么 ls / 3./下有超级用户root的家目录(root),还有普通用户的家目录(/home) 4.常用文件夹 ...

  5. H5的video标签在网页上播放MP4视频时只有声音没有画面

    最近做一个项目时,发现mp4文件播放时没有图像,只有声音,代码检查了N次,都没有问题,就算是直接使用网上的实例代码,也只能播放实例视频,mp4文件绝对路径,相对路径也都试了,还是不能播放我的mp4. ...

  6. vue组件之事件

    自定义事件 通过prop属性,父组件可以向子组件传递数据,而子组件的自定义事件就是用来将内部的数据报告给父组件的. <div id="app3"> <my-com ...

  7. Django框架——基础教程(总)

    1. Django简介 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架 ...

  8. N4_75条语法

    1. コ/ソ/ア/ド体系 -(こ.そ.あ.ど)れ/-(こ.そ.あ.ど)の A:-(こ.そ.あ.ど)れ 接续: 指示代词和场所代词,分近称.中称.远称.疑问称. 意思: 这个,那个,那个,哪个 例:これ ...

  9. MySQL之RPM安装说明及配置

    1.查看当前系统是否安装过Linux rpm -qa | grep -i mysql 未安装无任何输出:安装会打印对应mysql的rpm安装包. 2.准备安装包: MySQL-client-5.5.4 ...

  10. 10、LNMP架构

    1LNMP架构概述 1.1.什么是LNMP  LNMP 是一套技术的组合,L = Linux,N = Nginx,M~ = MySQL,P~ = PHP 1.2.LNMP架构是如何工作的 首先Ngin ...