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相关推荐

  1. POJ - 2763 Housewife Wind LCA+dfs序+线段树

    q次询问求两个点之间的距离,并且可以随时修改某条边的长度,最短距离可以用lca来求,但是树上维护每一个点到root的距离必须要用dfs序来记录时间戳,在dfs的时候顺便记录每一条边(u,v)对应的v节 ...

  2. POJ 2763 Housewife Wind【LCA_RMQ+树状数组】

    题意: 知道了一颗有  n 个节点的树和树上每条边的权值,对应两种操作: 0 x        输出 当前节点到 x节点的最短距离,并移动到 x 节点位置 1 x val   把第 x 条边的权值改为 ...

  3. POJ 2763 Housewife Wind 笔记

    n 座小屋,构成一棵树.q 条查询,出发点在小屋 s.接着 n-1 行,道路 i 从小屋 ai 到 bi 需要时间 wi .0 类查询:求从当前位置移到小屋 u 所需时间.1 类查询:将通过道路 i ...

  4. POJ - 2763 Housewife Wind

    传送门 第一次遇到这么有意思的题目. 首先介绍一下dfs序. dfs顾名思义 是用dfs遍历一棵树时,各节点出现的顺序.这样可以把一个无序的问题转换为有序的. dfs最大的特点是一个点的子树一定是一段 ...

  5. Housewife Wind POJ - 2763 倍增LCA+树状数组 或 树链剖分+线段树

    题目 链接:http://poj.org/problem?id=2763 Language:Default Housewife Wind Time Limit: 4000MS   Memory Lim ...

  6. [树链剖分][SDOI 2011]染色,Housewife Wind

    文章目录 T1:Housewife Wind 题目 题解 code T2:染色 题目 题解 code 今天选择写这篇博客主要是为了告诉大家一个道理,数组比vectorvectorvector快太多了, ...

  7. Housewife Wind

    题目:Housewife Wind 题解:题目修改的是边权,求的和也是边权之和,可以先建立一棵树,然后将边权移到下面的点变成点权,求和的时候只要再将LCA(x,y)的点权减掉就可以了. 边权变成点权的 ...

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

最新文章

  1. python错误-Python错误处理和异常处理
  2. 基于libsvm的中文文本分类原型
  3. P3605 [USACO17JAN]Promotion Counting P dfs序
  4. django models模型 内部类 class Meta 简介
  5. 【Java】利用循环嵌套实现输出一天的小时和分钟
  6. android8.0电脑壁纸,Android用原生分享多张图片适配7.0、8.0
  7. [20180124]测试SQLNET.EXPIRE_TIME参数3
  8. 【时间序列预测】基于matlab LMS麦基玻璃时间序列预测【含Matlab源码 1443期】
  9. python函数中文手册-python函数手册
  10. .NET面试题精简版
  11. php ora01017,建立DBLINK报ORA-01017,ORA-02063
  12. strcpy_s函数
  13. 轻量级网络之GhostNet
  14. CCD和CMOS大小(尺寸)对比图
  15. OpenGL(十四)——Qt OpenGL纹理
  16. java-操作 Excel
  17. python 遥感图像分类
  18. 年轮广场-NC13583(暴力)
  19. esp8266-01s介绍与使用
  20. 如何构建产品帮助中心?

热门文章

  1. windows+VS2017+opencv4.1.0环境配置
  2. 基于android os 5.1,Android 5.1.1版氢OS快速体验
  3. Java中的抽象类和方法
  4. qt中用mysql获取所有的数据库、数据库中的表名
  5. HDU2023 求平均成绩
  6. 【AMAD】splinter -- 用于测试web app的python框架
  7. bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】
  8. HDU4084 插头dp
  9. 一 Storm 基础
  10. JSP/Servlet基础语法