FZU 2082(过路费)
题目链接:传送门
题目大意:中文题,略
题目思路:树链剖分(注意要把边上的权值转移到深度较大的点上来维护)
最后当top[x]==top[y]注意id[x]+1因为是维护的点而题目是边
如果不+可能会出现重复加的情况。
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <algorithm>
- #include <cstring>
- #include <stack>
- #include <cctype>
- #include <queue>
- #include <string>
- #include <vector>
- #include <set>
- #include <map>
- #include <climits>
- #define lson rt<<1,l,mid
- #define rson rt<<1|1,mid+1,r
- #define fi first
- #define se second
- #define ping(x,y) ((x-y)*(x-y))
- #define mst(x,y) memset(x,y,sizeof(x))
- #define mcp(x,y) memcpy(x,y,sizeof(y))
- using namespace std;
- #define gamma 0.5772156649015328606065120
- #define MOD 1000000007
- #define inf 0x3f3f3f3f
- #define N 50005
- #define maxn 30010
- typedef pair<int,int> PII;
- typedef long long LL;
- LL read(){
- LL x=,f=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
- return x*f;
- }
- int head[N],hcnt;
- int n,m,flag,L,R;
- int son[N],siz[N],fa[N],top[N];
- int id[N],tid,dep[N],posi[N];
- LL seg[N<<];
- struct Node{int to,nxt;LL v;}node[N<<];
- struct Edge{int x,y;LL v;}edge[N];
- void dfs1(int u,int f,int deep){
- fa[u]=f,dep[u]=deep,siz[u]=;
- for(int i=head[u];~i;i=node[i].nxt){
- int e=node[i].to;if(e==f)continue;
- dfs1(e,u,deep+);siz[u]+=siz[e];
- if(!son[u]||siz[son[u]]<siz[e])son[u]=e;
- }
- }
- void dfs2(int u,int tp){
- top[u]=tp,id[u]=++tid,posi[tid]=u;
- if(!son[u])return;dfs2(son[u],tp);
- for(int i=head[u];~i;i=node[i].nxt){
- int e=node[i].to;
- if(!id[e])dfs2(e,e);
- }
- }
- LL query(int rt,int l,int r){
- if(L<=l&&r<=R)return seg[rt];
- int mid=l+r>>;LL temp=;
- if(L<=mid)temp+=query(lson);
- if(R>mid) temp+=query(rson);
- return temp;
- }
- void update(int rt,int l,int r,LL v){
- if(l==r){seg[rt]=v;return;}
- int mid=l+r>>;
- if(L<=mid)update(lson,v);
- else update(rson,v);
- seg[rt]=seg[rt<<]+seg[rt<<|];
- }
- void lca(int x,int y){
- LL res=;
- while(top[x]!=top[y]){
- if(dep[top[x]]<dep[top[y]])swap(x,y);
- L=id[top[x]],R=id[x];
- res+=query(,,n);
- x=fa[top[x]];
- }
- if(dep[x]<dep[y])swap(x,y);
- L=id[y]+,R=id[x]; ///注意L +1
- if(x!=y)res+=query(,,n);
- printf("%lld\n",res);
- }
- void init(){
- mst(head,-);hcnt=tid=;
- mst(siz,);mst(son,);mst(id,);
- }
- int main(){
- int i,j,group,x,y,v,Case=;
- while(scanf("%d%d",&n,&m)!=EOF){
- init();
- for(i=;i<n;++i){
- x=read(),y=read(),v=read();
- edge[i].x=x,edge[i].y=y,edge[i].v=v;
- node[hcnt].v=v,node[hcnt].to=y,node[hcnt].nxt=head[x],head[x]=hcnt++;
- node[hcnt].v=v,node[hcnt].to=x,node[hcnt].nxt=head[y],head[y]=hcnt++;
- }
- dfs1(,,);dfs2(,);
- for(i=;i<n;++i){
- if(dep[edge[i].x]<dep[edge[i].y])swap(edge[i].x,edge[i].y);
- L=id[edge[i].x];
- update(,,n,edge[i].v);
- }
- while(m--){
- x=read();
- if(x==){
- x=read(),y=read();
- L=id[edge[x].x];
- update(,,n,y);
- }
- else{
- x=read(),y=read();
- lca(x,y);
- }
- }
- }
- return ;
- }
FZU 2082(过路费)的更多相关文章
- FZU 2082 过路费(树链剖分)
FZU 2082 过路费 题目链接 树链抛分改动边的模板题 代码: #include <cstdio> #include <cstring> #include <vect ...
- fzu 2082 过路费 (树链剖分+线段树 边权)
Problem 2082 过路费 Accept: 887 Submit: 2881Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
- FZU 2082 过路费 (树链剖分 修改单边权)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 树链剖分模版题,求和,修改单边权. #include <iostream> #include ...
- FZU 2082 过路费(树链剖分)
树链剖分模板题. FZU炸了,等交上去AC了再贴代码.
- FZU 2082 过路费
树链剖分模板题 #include <cstdio> #include <iostream> #include <cstring> #include <algo ...
- FZU 2082 过路费(树链剖分 边权)题解
题意:给出每条边权值,可以更新每条边权值,询问两个点路径的最小权值 思路:重链剖分边权化点权,让每个儿子节点继承边权. 插点权的时候比较边的两个节点的深度,插进儿子节点中. 代码: #include& ...
- Fzu Problem 2082 过路费 LCT,动态树
题目:http://acm.fzu.edu.cn/problem.php?pid=2082 Problem 2082 过路费 Accept: 528 Submit: 1654Time Limit ...
- FZU Problem 2082 过路费 树链剖分
Problem 2082 过路费 Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新, ...
- FZU Problem 2082 过路费
Problem 2082 过路费 Accept: 875 Submit: 2839Time Limit: 1000 mSec Memory Limit : 32768 KB Problem ...
- FZU oj Problem 2082 过路费
Problem 2082 过路费 Pro ...
随机推荐
- linux内核支持U-disk和U转串
配置内核 make menuconfig,选中device驱动 Device Drivers ---->USB support--->USB Serial Converter suppor ...
- ASP.NET中上传图片检测其是否为真实的图片 防范病毒上传至服务器
一.需求 我们在用.net开发网站时,经常会用到图片上传,可以说是每个网站必备的,大到门户网站,电商网站,政务系统,OA系统,小到企业网站,个人网站,博客网站,导航网站等等,都有用到图片上传,那么在客 ...
- C++实现 逆波兰表达式计算问题
C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...
- ASP.NET 防止重复提交提示层
今天研究了下,其实我希望的很简单,就是有个封装好的提示层,等处理完后,刷新界面时 能自动消失 找了挺久的,找到这个控件还不错 完整Demo地址: http://download.csdn.net/de ...
- 记一次坑爹的golang 二维map判断问题
记一次坑爹的golang 二维map判断问题 2018年10月18日 23:16:21 yinnnnnnn 阅读数:32更多 个人分类: golang 版权声明:本文为博主原创文章,未经博主允许不 ...
- spring boot 拦截器之WebMvcConfigurerAdapter
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 上一篇我们讲到了拦截器,我们也简单的讲解到了WebMvcConfigurerAdapter这个拦截器.本篇我们来对Web ...
- html2canvas如何在元素隐藏的情况下生成截图
html2canvas官网地址:http://html2canvas.hertzen.com/ github地址:https://github.com/niklasvh/html2canvas/ 从官 ...
- 关于Javascript判断变量是否为空
如何判断Javascript对象是否存在 原文网址:http://www.ruanyifeng.com/blog/2011/05/how_to_judge_the_existence_of_a_glo ...
- 简单十招提高jQuery执行效率
1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...
- [android] Android 错误集锦
问题1:导入工程时报错The import android.XXX cannot be resolved 解决方法: 1.右键工程→Bulid Path→Configure Build Path... ...