树剖的裸题,中文题面所以就不多解释了,当然操作二,就是简单的求过路费之和,因为路径唯一,他的那个最少过路费我也是醉了。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxn = 50000+10;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
struct Point{int x,y,val;
}point[maxn];
int head[maxn],edge_cnt,tot,value[maxn];
struct Edge{int to,next;
}edge[maxn<<1];
inline void ADD(int u,int v){edge[edge_cnt].to = v;edge[edge_cnt].next = head[u];head[u] = edge_cnt++;
}
int N,M;
int size[maxn],son[maxn],deep[maxn],fa[maxn];
void dfs1(int now,int father,int Deep){fa[now] = father;size[now] = 1;deep[now] = Deep;son[now] = 0;for(int i = head[now]; ~i; i = edge[i].next){int v = edge[i].to;if(v != father){dfs1(v,now,Deep+1);size[now] += size[v];if(size[son[now]] < size[v])son[now] = v;}}
}
int ID[maxn],Rank[maxn],top[maxn];
void dfs2(int now,int Top){top[now] = Top;ID[now] = ++tot;Rank[ID[now]] = now;if(son[now])dfs2(son[now],Top);for(int i = head[now]; ~i; i = edge[i].next){int v = edge[i].to;if(v != fa[now] && v != son[now]){dfs2(v,v);}}
}
struct Info{int l,r,sum;
};
#define MID int Mid = (tree[now].l+tree[now].r)>>1
struct SGT{Info tree[maxn<<2];inline void pushUp(int now){tree[now].sum = tree[now<<1].sum+tree[now<<1|1].sum;}void build(int now,int l,int r){tree[now].l = l;tree[now].r = r;if(l == r){tree[now].sum = value[Rank[l]];return;}int Mid = (l+r)>>1;build(now<<1,l,Mid);build(now<<1|1,Mid+1,r);pushUp(now);}inline void update(int now,int idx,int val){if(tree[now].l == tree[now].r){tree[now].sum = val;return;}MID;if(idx <= Mid)update(now<<1,idx,val);elseupdate(now<<1|1,idx,val);pushUp(now);}inline int query(int now,int l,int r){if(l <= tree[now].l && tree[now].r <= r)return tree[now].sum;MID;int ans = 0;if(l <= Mid)ans += query(now<<1,l,r);if(Mid < r)ans += query(now<<1|1,l,r);return ans;}
};
SGT sgt;
int work(int u,int v){int ans = 0;int tpu = top[u];int tpv = top[v];while(tpu != tpv){if(deep[tpu] < deep[tpv]){swap(u,v);swap(tpu,tpv);}ans += sgt.query(1,ID[tpu],ID[u]);u = fa[tpu];tpu = top[u];}if(u == v)return ans;if(deep[u] > deep[v])swap(u,v);ans += sgt.query(1,ID[son[u]],ID[v]);return ans;
}
int main(){while(~scanf("%d %d",&N,&M)){memset(head,-1,sizeof(head));edge_cnt = tot = 0;for(int i = 1; i < N; i++){point[i].x = read();point[i].y = read();point[i].val = read();ADD(point[i].x,point[i].y);ADD(point[i].y,point[i].x);}dfs1(1,0,0);dfs2(1,1);value[1] = 0;for(int i = 1; i < N; i++){if(deep[point[i].x] < deep[point[i].y])swap(point[i].x,point[i].y);value[point[i].x] = point[i].val;}sgt.build(1,1,N);int op,u,v;while(M--){op = read();u = read();v = read();if(!op)sgt.update(1,ID[point[u].x],v);elseprintf("%d\n",work(u,v));}}return 0;
}

FZU - 2082 过路费相关推荐

  1. FZU 2082 过路费

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 题意: 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每 ...

  2. FZU Problem 2082 过路费

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

  3. 树链剖分入门——[kuangbin]树链剖分

    树链剖分的本质就是将一棵树拆分成一段一段连续的区间,然后放在一起就可以用一棵单独的线段树处理区间问题,只需要将树上节点和线段树节点的对应关系求好就可以很方便的互相转换,而树上两点之间路径的相关问题就可 ...

  4. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  5. fzu 2150 Fire Game 【身手BFS】

    称号:fzu 2150 Fire Game :给出一个m*n的图,'#'表示草坪,' . '表示空地,然后能够选择在随意的两个草坪格子点火.火每 1 s会向周围四个格子扩散,问选择那两个点使得燃烧全部 ...

  6. FZU 1686 神龙的难题(DLX反复覆盖)

    FZU 1686 神龙的难题 题目链接 题意:中文题 思路:每个1看成列,每个位置作为左上角的矩阵看成行.dlx反复覆盖就可以 代码: #include <cstdio> #include ...

  7. FZU 1649 Prime number or not (Miller-Rabin素数测试)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1649 题目大意:很直接,判断一个数n(2<=n<=10^18)是不是素数.   当n达到long ...

  8. FZU 2159 WuYou

    FZU 2159 题意:给你两个串,A串和B串,其中A串有些不确定.叫你求 A < B的最大A串 做法:一开始做错了.去问小坤子,他讲了一下他的思路.就是开一个 f 数组.f[i]表示从第i位开 ...

  9. Uva 10537 过路费

    题目链接:http://vjudge.net/contest/143062#problem/C 题意: 给定一个无向图,大写字母是城市,小写字母是村庄,经过城市交过路费为当前货物的%5,路过村庄固定交 ...

最新文章

  1. mysql 索引与约束_MySQL之索引与约束条件
  2. 增加行星轮减速后机械臂调试
  3. 8行代码求解非线性方程
  4. vim normal 模式下L键
  5. dbms标识符无效_DBMS中的聚合运算符(分组依据和具有子句)
  6. 为什么ConcurrentHashMap不允许插入null值?
  7. 【剑指 offer】(十八)—— 树的子结构
  8. 孙鑫VC学习笔记:第二十讲 (二) ado数据库编程
  9. spring 常用注解以分类
  10. IDE之VS:Visual Studio的简介(包括 VS2013、VS2015、VS2017、VS2019)、安装、入门、使用方法之详细攻略
  11. 三个网络接口计算机主板,电脑主板接口安装详解
  12. 从根本上降低采购成本,不割韭菜~
  13. 对LARS(Least Angle Regression)的简单理解
  14. SecureCRT的设置
  15. 客户端访问https时应无浏览器(含终端)安全警告信息;_Http升级Https(Let#x27;s Encrypt)...
  16. 一、AUTOSAR概述
  17. NVIDIA CUDA Toolkit 各个版本安装方式
  18. A-小鱼吐泡泡(第二场)
  19. 【matlab】matlab中的大小写转换
  20. Ubuntu 让用户获得root权限(附修复I have no name !;sudo: unknown uid 1000: who are you?)

热门文章

  1. 【算法】 AOV网与AOE网
  2. svn多项目多仓库实例
  3. 使用H5的Canvas,实现证件照的识别
  4. 全国计算机一级考试wps,2017全国计算机一级考试WPS Office考试大纲
  5. 【C语言练习】抢红包
  6. jquery.slimscroll.min.js轮动条插件
  7. 联想小新M7208W一体机扫描功能恢复
  8. js中的变量提升和函数提升——精炼版
  9. 萌新iOS开发者看WWDC19
  10. IF:6+ 综合分析揭示了一种炎症性癌症相关的成纤维细胞亚型在预测膀胱癌患者的预后和免疫治疗反应方面具有重要意义...