题目链接:传送门

题目大意:中文题,略

题目思路:树链剖分(注意要把边上的权值转移到深度较大的点上来维护)

          最后当top[x]==top[y]注意id[x]+1因为是维护的点而题目是边

          如果不+可能会出现重复加的情况。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <cstring>
  7. #include <stack>
  8. #include <cctype>
  9. #include <queue>
  10. #include <string>
  11. #include <vector>
  12. #include <set>
  13. #include <map>
  14. #include <climits>
  15. #define lson rt<<1,l,mid
  16. #define rson rt<<1|1,mid+1,r
  17. #define fi first
  18. #define se second
  19. #define ping(x,y) ((x-y)*(x-y))
  20. #define mst(x,y) memset(x,y,sizeof(x))
  21. #define mcp(x,y) memcpy(x,y,sizeof(y))
  22. using namespace std;
  23. #define gamma 0.5772156649015328606065120
  24. #define MOD 1000000007
  25. #define inf 0x3f3f3f3f
  26. #define N 50005
  27. #define maxn 30010
  28. typedef pair<int,int> PII;
  29. typedef long long LL;
  30. LL read(){
  31. LL x=,f=;char ch=getchar();
  32. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  33. while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
  34. return x*f;
  35. }
  36. int head[N],hcnt;
  37. int n,m,flag,L,R;
  38. int son[N],siz[N],fa[N],top[N];
  39. int id[N],tid,dep[N],posi[N];
  40. LL seg[N<<];
  41. struct Node{int to,nxt;LL v;}node[N<<];
  42. struct Edge{int x,y;LL v;}edge[N];
  43. void dfs1(int u,int f,int deep){
  44. fa[u]=f,dep[u]=deep,siz[u]=;
  45. for(int i=head[u];~i;i=node[i].nxt){
  46. int e=node[i].to;if(e==f)continue;
  47. dfs1(e,u,deep+);siz[u]+=siz[e];
  48. if(!son[u]||siz[son[u]]<siz[e])son[u]=e;
  49. }
  50. }
  51. void dfs2(int u,int tp){
  52. top[u]=tp,id[u]=++tid,posi[tid]=u;
  53. if(!son[u])return;dfs2(son[u],tp);
  54. for(int i=head[u];~i;i=node[i].nxt){
  55. int e=node[i].to;
  56. if(!id[e])dfs2(e,e);
  57. }
  58. }
  59. LL query(int rt,int l,int r){
  60. if(L<=l&&r<=R)return seg[rt];
  61. int mid=l+r>>;LL temp=;
  62. if(L<=mid)temp+=query(lson);
  63. if(R>mid) temp+=query(rson);
  64. return temp;
  65. }
  66. void update(int rt,int l,int r,LL v){
  67. if(l==r){seg[rt]=v;return;}
  68. int mid=l+r>>;
  69. if(L<=mid)update(lson,v);
  70. else update(rson,v);
  71. seg[rt]=seg[rt<<]+seg[rt<<|];
  72. }
  73. void lca(int x,int y){
  74. LL res=;
  75. while(top[x]!=top[y]){
  76. if(dep[top[x]]<dep[top[y]])swap(x,y);
  77. L=id[top[x]],R=id[x];
  78. res+=query(,,n);
  79. x=fa[top[x]];
  80. }
  81. if(dep[x]<dep[y])swap(x,y);
  82. L=id[y]+,R=id[x]; ///注意L +1
  83. if(x!=y)res+=query(,,n);
  84. printf("%lld\n",res);
  85. }
  86. void init(){
  87. mst(head,-);hcnt=tid=;
  88. mst(siz,);mst(son,);mst(id,);
  89. }
  90. int main(){
  91. int i,j,group,x,y,v,Case=;
  92. while(scanf("%d%d",&n,&m)!=EOF){
  93. init();
  94. for(i=;i<n;++i){
  95. x=read(),y=read(),v=read();
  96. edge[i].x=x,edge[i].y=y,edge[i].v=v;
  97. node[hcnt].v=v,node[hcnt].to=y,node[hcnt].nxt=head[x],head[x]=hcnt++;
  98. node[hcnt].v=v,node[hcnt].to=x,node[hcnt].nxt=head[y],head[y]=hcnt++;
  99. }
  100. dfs1(,,);dfs2(,);
  101. for(i=;i<n;++i){
  102. if(dep[edge[i].x]<dep[edge[i].y])swap(edge[i].x,edge[i].y);
  103. L=id[edge[i].x];
  104. update(,,n,edge[i].v);
  105. }
  106. while(m--){
  107. x=read();
  108. if(x==){
  109. x=read(),y=read();
  110. L=id[edge[x].x];
  111. update(,,n,y);
  112. }
  113. else{
  114. x=read(),y=read();
  115. lca(x,y);
  116. }
  117. }
  118. }
  119. return ;
  120. }

FZU 2082(过路费)的更多相关文章

  1. FZU 2082 过路费(树链剖分)

    FZU 2082 过路费 题目链接 树链抛分改动边的模板题 代码: #include <cstdio> #include <cstring> #include <vect ...

  2. fzu 2082 过路费 (树链剖分+线段树 边权)

    Problem 2082 过路费 Accept: 887    Submit: 2881Time Limit: 1000 mSec    Memory Limit : 32768 KB  Proble ...

  3. FZU 2082 过路费 (树链剖分 修改单边权)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 树链剖分模版题,求和,修改单边权. #include <iostream> #include ...

  4. FZU 2082 过路费(树链剖分)

    树链剖分模板题. FZU炸了,等交上去AC了再贴代码.

  5. FZU 2082 过路费

    树链剖分模板题 #include <cstdio> #include <iostream> #include <cstring> #include <algo ...

  6. FZU 2082 过路费(树链剖分 边权)题解

    题意:给出每条边权值,可以更新每条边权值,询问两个点路径的最小权值 思路:重链剖分边权化点权,让每个儿子节点继承边权. 插点权的时候比较边的两个节点的深度,插进儿子节点中. 代码: #include& ...

  7. Fzu Problem 2082 过路费 LCT,动态树

    题目:http://acm.fzu.edu.cn/problem.php?pid=2082 Problem 2082 过路费 Accept: 528    Submit: 1654Time Limit ...

  8. FZU Problem 2082 过路费 树链剖分

    Problem 2082 过路费    Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...

  9. FZU Problem 2082 过路费

    Problem 2082 过路费 Accept: 875    Submit: 2839Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem ...

  10. FZU oj Problem 2082 过路费

                                                                                    Problem 2082 过路费 Pro ...

随机推荐

  1. linux内核支持U-disk和U转串

    配置内核 make menuconfig,选中device驱动 Device Drivers ---->USB support--->USB Serial Converter suppor ...

  2. ASP.NET中上传图片检测其是否为真实的图片 防范病毒上传至服务器

    一.需求 我们在用.net开发网站时,经常会用到图片上传,可以说是每个网站必备的,大到门户网站,电商网站,政务系统,OA系统,小到企业网站,个人网站,博客网站,导航网站等等,都有用到图片上传,那么在客 ...

  3. C++实现 逆波兰表达式计算问题

    C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...

  4. ASP.NET 防止重复提交提示层

    今天研究了下,其实我希望的很简单,就是有个封装好的提示层,等处理完后,刷新界面时 能自动消失 找了挺久的,找到这个控件还不错 完整Demo地址: http://download.csdn.net/de ...

  5. 记一次坑爹的golang 二维map判断问题

    记一次坑爹的golang 二维map判断问题 2018年10月18日 23:16:21 yinnnnnnn 阅读数:32更多 个人分类: golang   版权声明:本文为博主原创文章,未经博主允许不 ...

  6. spring boot 拦截器之WebMvcConfigurerAdapter

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   上一篇我们讲到了拦截器,我们也简单的讲解到了WebMvcConfigurerAdapter这个拦截器.本篇我们来对Web ...

  7. html2canvas如何在元素隐藏的情况下生成截图

    html2canvas官网地址:http://html2canvas.hertzen.com/ github地址:https://github.com/niklasvh/html2canvas/ 从官 ...

  8. 关于Javascript判断变量是否为空

    如何判断Javascript对象是否存在 原文网址:http://www.ruanyifeng.com/blog/2011/05/how_to_judge_the_existence_of_a_glo ...

  9. 简单十招提高jQuery执行效率

    1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...

  10. [android] Android 错误集锦

    问题1:导入工程时报错The import android.XXX cannot be resolved 解决方法: 1.右键工程→Bulid Path→Configure Build Path... ...