poj 2763 Housewife Wind
LCA
题意:一个无根树,给出主角一开始所在的位置S,然后下面q个操作,操作包括查询和修改操作,对于查询操作就是当前主角的位置到目的点的距离是多少,然后主角去到那里之后就在那里等待,下次查询的时候那里就是新的起点(所以sample中第二次查询为什么是3)。修改是修改第k条边的权值,边的编号就是输入的顺序。
这题可能是数据水了还是怎么,对于修改操作虽然有优化的方法,但是用最朴素的直接遍历下去修改也是可行的,不会超时,不过时间就比较糟糕了
修改操作其实是修改了一部分子树的dir值,对于查询操作就是普通的LCA
这里只能用RMQ了,不能用Tarjan
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; const int N = 100005; const int M = 20;int __pow[M]; int head[N],tot; struct edge{int u,v,w,next; }e[2*N]; int dep[N],first[N],dir[N],vis[N],ver[2*N],R[2*N]; int dp[2*N][M];inline void add(int u ,int v ,int w) {e[tot].u = u; e[tot].v = v; e[tot].w = w;e[tot].next = head[u]; head[u] = tot++; }void dfs(int u ,int d) {tot++; vis[u] = 1; dep[u] = d; first[u] = tot; ver[tot] = u; R[tot] = d;for(int k=head[u]; k!=-1; k=e[k].next)if(!vis[e[k].v]){int v = e[k].v , w = e[k].w;dir[v] = dir[u] + w;dfs(v,d+1);tot++; ver[tot] = u; R[tot] = d;} }void ST(int n) {int K = (int)(log((double)n) / log(2.0));for(int i=1; i<=n; i++) dp[i][0] = i;for(int j=1; j<=K; j++)for(int i=1; i+__pow[j]-1<=n; i++){int a = dp[i][j-1] , b = dp[i+__pow[j-1]][j-1];if(R[a] < R[b]) dp[i][j] = a;else dp[i][j] = b;} }inline int RMQ(int x ,int y) {int K = (int)( log((double)(y-x+1)) / log(2.0) );int a = dp[x][K] , b = dp[y-__pow[K]+1][K];if(R[a] < R[b]) return a;else return b; }int LCA(int u ,int v) {int x = first[u] , y = first[v];if(x > y) swap(x,y);int index = RMQ(x,y);return ver[index]; }void travel(int u , int par ,int delta) {dir[u] += delta;for(int k=head[u]; k!=-1; k=e[k].next)if(e[k].v != par){int v = e[k].v;travel(v,u,delta);} }int main() {int n,q,sp;for(int i=0; i<M; i++) __pow[i] = (1<<i);while(scanf("%d%d%d",&n,&q,&sp)!=EOF){tot = 0;memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));for(int i=1; i<n; i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}tot = dir[1] = 0;dfs(1,1);ST(2*n-1);while(q--){int c;scanf("%d",&c);if(c == 0){int v;scanf("%d",&v);int lca = LCA(sp,v);printf("%d\n",dir[sp] + dir[v] - 2*dir[lca]);sp = v;}else{int k,w,delta,u,v;scanf("%d%d",&k,&w);k = (k-1) << 1; u = e[k].u; v = e[k].v; delta = w - e[k].w; e[k].w = e[k^1].w = w;int x = dep[u] > dep[v] ? u : v;int y = dep[u] < dep[v] ? u : v;travel(x,y,delta);}// for(int i=1; i<=n; i++) printf("%d ",dir[i]); printf("\n"); }}return 0; }
转载于:https://www.cnblogs.com/scau20110726/archive/2013/06/01/3111715.html
poj 2763 Housewife Wind相关推荐
- POJ - 2763 Housewife Wind LCA+dfs序+线段树
q次询问求两个点之间的距离,并且可以随时修改某条边的长度,最短距离可以用lca来求,但是树上维护每一个点到root的距离必须要用dfs序来记录时间戳,在dfs的时候顺便记录每一条边(u,v)对应的v节 ...
- POJ 2763 Housewife Wind【LCA_RMQ+树状数组】
题意: 知道了一颗有 n 个节点的树和树上每条边的权值,对应两种操作: 0 x 输出 当前节点到 x节点的最短距离,并移动到 x 节点位置 1 x val 把第 x 条边的权值改为 ...
- POJ 2763 Housewife Wind 笔记
n 座小屋,构成一棵树.q 条查询,出发点在小屋 s.接着 n-1 行,道路 i 从小屋 ai 到 bi 需要时间 wi .0 类查询:求从当前位置移到小屋 u 所需时间.1 类查询:将通过道路 i ...
- POJ - 2763 Housewife Wind
传送门 第一次遇到这么有意思的题目. 首先介绍一下dfs序. dfs顾名思义 是用dfs遍历一棵树时,各节点出现的顺序.这样可以把一个无序的问题转换为有序的. dfs最大的特点是一个点的子树一定是一段 ...
- Housewife Wind POJ - 2763 倍增LCA+树状数组 或 树链剖分+线段树
题目 链接:http://poj.org/problem?id=2763 Language:Default Housewife Wind Time Limit: 4000MS Memory Lim ...
- [树链剖分][SDOI 2011]染色,Housewife Wind
文章目录 T1:Housewife Wind 题目 题解 code T2:染色 题目 题解 code 今天选择写这篇博客主要是为了告诉大家一个道理,数组比vectorvectorvector快太多了, ...
- Housewife Wind
题目:Housewife Wind 题解:题目修改的是边权,求的和也是边权之和,可以先建立一棵树,然后将边权移到下面的点变成点权,求和的时候只要再将LCA(x,y)的点权减掉就可以了. 边权变成点权的 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
最新文章
- python错误-Python错误处理和异常处理
- 基于libsvm的中文文本分类原型
- P3605 [USACO17JAN]Promotion Counting P dfs序
- django models模型 内部类 class Meta 简介
- 【Java】利用循环嵌套实现输出一天的小时和分钟
- android8.0电脑壁纸,Android用原生分享多张图片适配7.0、8.0
- [20180124]测试SQLNET.EXPIRE_TIME参数3
- 【时间序列预测】基于matlab LMS麦基玻璃时间序列预测【含Matlab源码 1443期】
- python函数中文手册-python函数手册
- .NET面试题精简版
- php ora01017,建立DBLINK报ORA-01017,ORA-02063
- strcpy_s函数
- 轻量级网络之GhostNet
- CCD和CMOS大小(尺寸)对比图
- OpenGL(十四)——Qt OpenGL纹理
- java-操作 Excel
- python 遥感图像分类
- 年轮广场-NC13583(暴力)
- esp8266-01s介绍与使用
- 如何构建产品帮助中心?
热门文章
- windows+VS2017+opencv4.1.0环境配置
- 基于android os 5.1,Android 5.1.1版氢OS快速体验
- Java中的抽象类和方法
- qt中用mysql获取所有的数据库、数据库中的表名
- HDU2023 求平均成绩
- 【AMAD】splinter -- 用于测试web app的python框架
- bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】
- HDU4084 插头dp
- 一 Storm 基础
- JSP/Servlet基础语法