题目链接:http://poj.org/problem?id=2763

题意:

给定一棵含n个结点的树和树的边权,共有q次操作,分为两种

0 c :求从位置s到c的距离,然后s变成c

1 a b:把第a条边的权值变为b

分析:

树链剖分,注意查询后要改变起点

代码如下:

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring> using namespace std;
const int maxn=; struct Edge
{
int to,next;
}edge[maxn*];
int head[maxn];
int cnt,tmp,n;
int dep[maxn],fa[maxn],size[maxn],son[maxn],top[maxn],id[maxn],rank[maxn];
struct Node
{
int u,v,c;
}node[maxn]; void init()
{
memset(head,-,sizeof(head));
memset(son,-,sizeof(son));
tmp=;
cnt=;
} void addedge(int u,int v)
{
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
} void dfs_1(int u,int f,int d)
{
dep[u]=d;
size[u]=;
fa[u]=f;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(v==f)
continue;
dfs_1(v,u,d+);
size[u]+=size[v];
if(son[u]==-||size[son[u]]<size[v])
son[u]=v;
}
} void dfs_2(int u,int tp)
{
top[u]=tp;
id[u]=++tmp;
rank[tmp]=u;
if(son[u]!=-)
dfs_2(son[u],tp);
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
if(v!=fa[u]&&v!=son[u])
dfs_2(v,v);
}
}
struct Tree
{
int left,right;
int t;
}tree[maxn*]; void pushup(int i)
{
tree[i].t=tree[i*].t+tree[i*+].t;
} void build(int i,int begin,int end)
{
tree[i].left=begin;
tree[i].right=end;
tree[i].t=;
if(begin==end)
return;
int mid=(begin+end)/;
build(i*,begin,mid);
build(i*+,mid+,end);
} void update(int i,int k,int val)
{
if(tree[i].left==k&&tree[i].right==k)
{
tree[i].t=val;
return;
}
int mid=(tree[i].left+tree[i].right)/;
if(k<=mid)
update(i*,k,val);
else
update(i*+,k,val);
pushup(i);
} int query(int i,int begin,int end)
{
if(tree[i].left>=begin&&tree[i].right<=end)
return tree[i].t;
int mid=(tree[i].left+tree[i].right)/;
int res=;
if(mid>=begin)
res+=query(i*,begin,end);
if(mid<end)
res+=query(i*+,begin,end);
return res;
} int find(int u,int v)
{
int tp1=top[u],tp2=top[v];
int res=;
while(tp1!=tp2)
{
if(dep[tp1]<dep[tp2])
{
swap(tp1,tp2);
swap(u,v);
}
res+=query(,id[tp1],id[u]);
u=fa[tp1];
tp1=top[u];
}
if(u==v)
return res;
if(dep[u]>dep[v])
swap(u,v);
res+=query(,id[son[u]],id[v]);
return res;
} int main()
{
int n,q,s;
scanf("%d%d%d",&n,&q,&s);
init();
for(int i=;i<n;i++)
{
scanf("%d%d%d",&node[i].u,&node[i].v,&node[i].c);
addedge(node[i].u,node[i].v);
addedge(node[i].v,node[i].u);
}
dfs_1(,,);
dfs_2(,);
build(,,tmp);
for(int i=;i<n;i++)
{
if(dep[node[i].u]>dep[node[i].v])
swap(node[i].u,node[i].v);
update(,id[node[i].v],node[i].c);
}
for(int i=;i<q;i++)
{
int a,k,w;
scanf("%d",&a);
if(a==)
{
scanf("%d",&k);
printf("%d\n",find(s,k));
s=k;
}
else
{
scanf("%d%d",&k,&w);
update(,id[node[k].v],w);
}
}
return ;
}

poj 2763 Housewife Wind (树链剖分)的更多相关文章

  1. POJ - 2763 Housewife Wind (树链剖分/ LCA+RMQ+树状数组)

    题意:有一棵树,每条边给定初始权值.一个人从s点出发.支持两种操作:修改一条边的权值:求从当前位置到点u的最短路径. 分析:就是在边可以修改的情况下求树上最短路.如果不带修改的话,用RMQ预处理LCA ...

  2. POJ 2763 Housewife Wind (树链剖分 有修改单边权)

    题目链接:http://poj.org/problem?id=2763 n个节点的树上知道了每条边权,然后有两种操作:0操作是输出 当前节点到 x节点的最短距离,并移动到 x 节点位置:1操作是第i条 ...

  3. poj 2763 Housewife Wind : 树链剖分维护边 O(nlogn)建树 O((logn)²)修改与查询

    /** problem: http://poj.org/problem?id=2763 **/ #include<stdio.h> #include<stdlib.h> #in ...

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

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

  5. POJ 2763 Housewife Wind 树链拋分

    一.前言 这破题WA了一天,最后重构还是WA,最后通过POJ讨论版得到的数据显示,我看上去是把某个变量写错了..于是,还是低级错误背锅啊....代码能力有待进一步提升2333333 二.题意 某家庭主 ...

  6. POJ2763 Housewife Wind 树链剖分 边权

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

  7. poj 2763(RMQ+BIT\树链剖分)

    传送门:Problem 2763 https://www.cnblogs.com/violet-acmer/p/9686774.html 题意: 一对夫妇居住在xx村庄,小屋之间有双向可达的道路,不会 ...

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

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

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

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

随机推荐

  1. getcomputedstyle()获取border像素差异问题

    getComputedStyle()方法返回的是一个CSS样式声明对象--CSSStyleDeclaration对象(与style属性的类型相同),包含当前元素所有最终使用的CSS属性值: <! ...

  2. Nginx文档-初学者指南

    原文档: http://nginx.org/en/docs/beginners_guide.html 译者:Oopsguy 本指南旨在介绍nginx基本内容和一些在Nginx上可以完成的简单任务.这里 ...

  3. 聊一聊FE面试那些事

    聊一聊FE面试那些事 最近公司由于业务的扩展.技术的延伸需要招一批有能力的小伙伴加入,而我有幸担任"技术面试官"的角色前前后后面试了不下50多位候选人,如同见证了50多位前端开发者 ...

  4. (转)MySql数据库索引原理(总结性)

    本文引用文章如链接: http://www.codinglabs.org/html/theory-of-mysql-index.html#more-100 参考书籍:Mysql技术内幕 本文主要是阐述 ...

  5. MySQL学习笔记(五):MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  6. poj 3761 bubble sort (排列组合)

    #include<cstdio> #include<cstring> #define ll long long #define mod 20100713 ; ll a[maxn ...

  7. year:2017 month:7 day:19

    2017-07-19 JavaScript 一:javascirpt的对象 1:数组对象 声明方式:(1)var arr=new Array(): (2)var arr=new Array(12): ...

  8. jsp页面中某个src,如某个iframe的src,应该填写什么?可以是html、jsp、servlet、action吗?是如何加载的?

    jsp页面中某个src,如某个iframe的src,应该填写什么?可以是html.jsp.servlet.action吗?是如何加载的? 如有个test工程,其某个jsp中有个iframe,代码如下: ...

  9. pickle和json模块

    json模块 json模块是实现序列化和反序列化的,主要用户不同程序之间的数据交换,首先来看一下: dumps()序列化 import json '''json模块是实现序列化和反序列话功能的''' ...

  10. trie从入门到入殓

    trie是什么?1. 字典树 2.集合 (其实两个都对啊喂) 一颗普通的trie树一般类似于这样(图片来源于http://dongxicheng.org/structure/trietree/): 绿 ...