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

题意分析

给出n个点,m个询问,和当前位置pos。

先给出n-1条边,u->v以及边权w。

然后有m个询问,询问分2种:

一是讲第i条边的边权修改为w。

二是询问从当前位置走到点x经过的边权和(下次询问就是从这点开始)。

边权的树链剖分,其实和点权的差不多。对于一条边u-v,及其边权w,在建立线段树的时候,将深度大的点,当做其边权w,如dep[u]>dep[v],就令newid[u] = w。这样一来,将边权问题转化为点权问题,需要注意的,就是在查询的时候,对于lca的处理。

处理方法也很简单,首先判断:当深度大的网上爬,爬到一定程度的时候,是否两点已经重合,若是的话,直接返回值就好。 否则,就用查询[深度小的儿子]到[深度大的这段区间],并将结果累加到ans中。

代码总览

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll int
#define nmax 100820
using namespace std;
int fa[nmax],son[nmax],sz[nmax],newid[nmax],hashback[nmax],dep[nmax],top[nmax];
int num,tot,head[nmax];
struct edge{
int to;
int next;
}edg[nmax<<1];
struct tree{
int l,r,val;
int mid(){
return (l+r)>>1;
}
}tree[nmax<<2];
struct mess{
int u,v,w;
}mes[nmax];
void add(int u, int v){
edg[tot].to = v;
edg[tot].next = head[u];
head[u] = tot++;
}
void dfsFirst(int rt, int f,int d){
dep[rt] = d;
fa[rt] = f;
sz[rt] = 1;
for(int i = head[rt]; i!= -1; i = edg[i].next){
int nxt = edg[i].to;
if(nxt != f){
dfsFirst(nxt,rt,d+1);
sz[rt]+=sz[nxt];
if(son[rt] == -1 || sz[nxt] > sz[son[rt]]){
son[rt] = nxt;
}
} }
}
void dfsSecond(int rt, int tp){
top[rt] = tp;
newid[rt] = ++num;
if(son[rt] == -1) return;
dfsSecond(son[rt],tp);
for(int i = head[rt];i != -1; i = edg[i].next){
int nxt = edg[i].to;
if(nxt != son[rt] && nxt != fa[rt])
dfsSecond(nxt,nxt);
}
}
void init(){
memset(tree,0,sizeof tree);
memset(head,-1,sizeof head);
memset(son,-1,sizeof son);
memset(edg,0,sizeof edg);
tot = num = 0;
}
void PushUp(int rt){
tree[rt].val = tree[rt<<1].val + tree[rt<<1|1].val;
}
void Build(int l, int r, int rt){
tree[rt].l = l; tree[rt].r = r;
if(l == r){
return;
}
Build(l,tree[rt].mid(),rt<<1);
Build(tree[rt].mid()+1,r,rt<<1|1);
PushUp(rt);
}
void UpdatePoint(int val, int pos, int rt){
if(tree[rt].l == tree[rt].r){
tree[rt].val = val ;
return;
}
if(pos <= tree[rt].mid()) UpdatePoint(val,pos,rt<<1);
else UpdatePoint(val,pos,rt<<1|1);
PushUp(rt);
}
int QuerySUM(int l,int r,int rt)
{;
if(l>tree[rt].r || r<tree[rt].l) return 0;
if(l <= tree[rt].l && tree[rt].r <= r) return tree[rt].val;
return QuerySUM(l,r,rt<<1) + QuerySUM(l,r,rt<<1|1);
}
long long Find_SUM(int x, int y){
int tx = top[x],ty =top[y];
long long ans = 0;
while(tx != ty){
if(dep[tx] < dep[ty]){
swap(x,y);
swap(tx,ty);
}
ans += QuerySUM(newid[tx],newid[x],1);
x = fa[tx]; tx = top[x];
}
if(x == y) return ans;
if(dep[x] > dep[y]) swap(x,y);
ans += QuerySUM(newid[son[x]],newid[y],1);
return ans;
} int n,m;
int main()
{
// freopen("in.txt","r",stdin);
int m,x,y,posnow;
int op;
while(scanf("%d %d %d",&n,&m,&posnow)!=EOF){
init();
for(int i =1;i<=n-1;++i){
scanf("%d %d %d",&mes[i].u,&mes[i].v,&mes[i].w);
add(mes[i].u,mes[i].v);
add(mes[i].v,mes[i].u);
}
num = 0;
dfsFirst(1,0,1);
dfsSecond(1,1);
Build(1,n,1);
for(int i = 1;i<=n-1;++i){
if(dep[mes[i].u] > dep[mes[i].v])// v is bigger;
swap(mes[i].u,mes[i].v);
UpdatePoint(mes[i].w,newid[mes[i].v],1); }
// printf("MESSA ID DATA FA SON SIZE DEEP NEWID TOP SEGHASH\n");
// for(int i = 1;i<=n;++i){
// printf("DEBUG %5d %5d %5d %5d %5d %5d %5d %5d %5d\n",i,data[i],fa[i],son[i],sz[i],dep[i],newid[i],top[i],seghash[i]);
// }
//
// printf("MESSA ID val\n");
// for(int i = 1;i<=n;++i){
// printf("DEBUF %d %d\n",i,QuerySUM(i,i,1));
// }
for(int i = 0;i<m;++i){
scanf("%d",&op);
if(op == 1){//change
scanf("%d %d",&x,&y);
x = newid[mes[x].v];
UpdatePoint(y,x,1);
}else {//ask
scanf("%d",&x);
printf("%lld\n",Find_SUM(posnow,x));
posnow = x;
}
}
}
return 0;
}

POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )的更多相关文章

  1. fzu 2082 过路费 (树链剖分+线段树 边权)

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

  2. BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )

    BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...

  3. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  4. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  5. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  6. 【POJ3237】Tree(树链剖分+线段树)

    Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...

  7. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  8. BZOJ4127Abs——树链剖分+线段树

    题目描述 给定一棵树,设计数据结构支持以下操作 1 u v d 表示将路径 (u,v) 加d 2 u v 表示询问路径 (u,v) 上点权绝对值的和 输入 第一行两个整数n和m,表示结点个数和操作数 ...

  9. ACM-ICPC 2018 焦作赛区网络预赛 E Jiu Yuan Wants to Eat (树链剖分+线段树)

    题目链接:https://nanti.jisuanke.com/t/31714 题意:给你一棵树,初始全为0,有四种操作: 1.u-v乘x    2.u-v加x   3. u-v取反  4.询问u-v ...

随机推荐

  1. jsp内置对象 转发与重定向的区别

    jsp 内置对象  转发与重定向的比较 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程. 与之相反,重 ...

  2. JavaWeb-Servlet-Tomcat

    Servlet就是运行在服务器上的Java类.Servlet容器为javaweb应用提供运行时环境,负责管理Servlet和JSP的生命周期,以及管理它们的共享数据. Servlet容器软件——Tom ...

  3. tomcat安装及使用详解

    常用软件安装及使用目录 资料链接:https://pan.baidu.com/s/1XOUlneFqt-_1tOLSmc-E1g     网盘分享的文件在此 1. Tomcat简介 Tomcat是一个 ...

  4. 2018年第九届蓝桥杯【C++省赛B组】

    2标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛.16点阵的字库把每个汉字看成是16x16个像素信息.并把这些信息记录在字节中. 一个字节可以存储8位信息,用32个字节就 ...

  5. Bing词典vs有道词典比对测试报告——体验篇之软件适应性

    联网情况: 在联网情况下,针对每一次查询,有道词典的反应速度明显比必应词典快得多.据我推测有以下两个原因: 有道词典有本地词库而必应词典更多依赖联网. 有道词典的服务器在国内而必应的在国外. 断网情况 ...

  6. react+webpack+wepack-dev-server的环境中ant design图标离线的方法

    1.首先说说我老姜对官方提供的demo的理解, 在理解的过程也学到了不少知识. 上图(图0)展示的官网demo的目录结构,node_modules是自己用node下载的, iconfont中是自己的离 ...

  7. 福大软工1816 · 评分结果 · Alpha冲刺

    作业地址:alpha冲刺1.alpha冲刺2.alpha冲刺3.alpha冲刺4.alpha冲刺5.alpha冲刺6.alpha冲刺7.alpha冲刺8.alpha冲刺9.alpha冲刺10 作业提交 ...

  8. (2016.2.2)1001.A+B Format (20)解题思路

    https://github.com/UNWILL2LOSE/object-oriented 解题思路 目标: *首先运算要求实现输入2个数后,输出类似于银行的支票上的带分隔符规则的数字. 代码实现思 ...

  9. PTA计算平均值(一波三折)

    PTA计算平均值( 一波三折) 现在为若干组整数分别计算平均值. 已知这些整数的绝对值都小于100,每组整数的数量不少于1个,不大于20个. 输入格式:首先输入K(不小于2,不大于20).接下来每一行 ...

  10. 怎样利用好单片机上的存储器资源来实现OD的存储与访问

    转自:http://www.cnblogs.com/winshton/p/4897789.html 我们知道OD(对象字典)是CANopen的核心,所有功能都是围绕它开展的,是协议栈的数据中心,良好的 ...