一、前言

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

二、题意

  某家庭主妇住在一棵树上,他的若干个孩子在树的若干个节点上有分布,主妇同学需要从某给定节点出发,飞到树上的制定节点,在过程中,边权可能会发生改变,问从当前节点到指定节点的边权和。

三、解法

  树链拋分,点更新查区间。

// #include<bits/stdc++.h>
#include<iostream>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std; #define ll long long
#define pp pair<int ,int> const ll MAXN=1e5+; class Node
{
public:
int next,to,cost;
void init(int a,int b,int c)
{
this->next=a;
this->to=b;
this->cost=c;
}
};
Node G[MAXN*];
int tree[MAXN],child[MAXN],deep[MAXN],number[MAXN],top[MAXN],points[MAXN],father[MAXN];
int size,summ,n,q,s;
void insert(int pos,int key)
{
while(pos<MAXN)
{
tree[pos]+=key;
pos+=pos&(-pos);
}
}
int getSum(int pos)
{
int ans=;
while(pos)
{
ans+=tree[pos];
pos-=pos&(-pos);
}return ans;
}
void add(int from,int to,int cost)
{
G[summ].init(points[from],to,cost);
points[from]=summ++;
}
void dfs_1(int now,int last,int dep)
{
deep[now]=dep;
father[now]=last;
child[now]=;
for(int i=points[now];i!=-;i=G[i].next)
{
int tar=G[i].to;
int cost=G[i].cost;
if(tar==last)continue;
dfs_1(tar,now,dep+);
child[now]+=child[tar];
}
}
void dfs(int now,int last,int first,int cc=)
{
top[now] = first ? first : now;
insert(size,cc);
// cout<<"check_number: "<<now<<ends<<size<<endl;
number[now]=size++;
int maxx,pos,coS;
maxx=pos=-;
for(int i=points[now];i!=-;i=G[i].next)
{
int tar=G[i].to;
int cost=G[i].cost;
if(tar==last)continue;
if(maxx<child[tar])
{
maxx=child[tar];
pos=tar;
coS=cost;
}
}if(pos!=-)dfs(pos,now,top[now],coS);
for(int i=points[now];i!=-;i=G[i].next)
{
int tar=G[i].to;
int cost=G[i].cost;
if(tar==last||tar==pos)continue; dfs(tar,now,,cost);
}
}
void update(int num,int key)
{
int a=G[num*].to;
int b=G[num*+].to;
if(father[a]==b)
{
key=key-(getSum(number[a])-getSum(number[a]-));
insert(number[a],key);
}else
{
key=key-(getSum(number[b])-getSum(number[b]-));
insert(number[b],key);
}
}
int query(int from,int to)
{
int ans=;
int t1=top[from];
int t2=top[to];
// cout<<"check_top: "<<t1<<ends<<t2<<endl;
// cout<<"check_point: "<<from<<ends<<to<<endl;
while(t1!=t2)
{
if(deep[t1]<deep[t2])
{
swap(t1,t2);
swap(from,to);
}
ans+=getSum(number[from])-getSum(number[t1]-);
from=father[t1];
t1=top[from];
}
int star=min(number[from],number[to]);
int endd=max(number[from],number[to]);
// cout<<ans<<"check_Number: "<<star<<ends<<endd<<endl;
// cout<<"checkSum: "<<getSum(endd)<<ends<<getSum(star)<<endl;
ans+=getSum(endd)-getSum(star);
return ans;
}
void init()
{
size=;summ=;
memset(points,-,sizeof(points));
for(int i=;i<n;++i)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
// cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}dfs_1(,,);
dfs(,,);
for(int i=;i<q;++i)
{
int a,b,c;
// cin>>c;
scanf("%d",&c);
if(c)
{
// cin>>a>>b;
scanf("%d%d",&a,&b);
a--;
update(a,b);
}else{
// cin>>a;
scanf("%d",&a);
cout<<query(s,a)<<"\n";
s=a;
}
}
} int main()
{
// cin.sync_with_stdio(false);
cin>>n>>q>>s;init(); return ;
}

POJ 2763 Housewife Wind 树链拋分的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. POJ2763 Housewife Wind 树链剖分 边权

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

  8. HDU 3966 Aragorn's Story 树链拋分

    一.写在前面 终于开始开坑link-cut-tree这个了,对于网上找到的大佬的前进路线,进行了一番研发,发现实际上可以实现对于树链拋分的制作.经历了若干长时间之后终于打了出来(为什么每次学什么东西都 ...

  9. POJ 2763 Housewife Wind(树链剖分)(线段树单点修改)

    Housewife Wind Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 10378   Accepted: 2886 D ...

随机推荐

  1. 《C#高效编程》读书笔记12-使用推荐成员初始化器而不是赋值语句

    通常来说类都有不止一个构造函数.随着时间推移,成员变量的增加,构造函数的个数也会不断的增加.预防这种情况的最好方法是,在声明变量的时候就进行初始化,而不是在每个构造函数中进行. //初始化变量时声明 ...

  2. SpringMVC 返回自定义属性名

    SpringMVC 返回的属性名默认是小写驼峰形式的实体对象中的属性名,如 userID 属性名它会返回 userId. 如果接口方式之前已经定下来,这样前端按原来的方式取数据会读取失败的,那有没有方 ...

  3. Flask蓝图的增删改查

    怎样用flask蓝图来实现增删改查呢?请看下面的内容 这是我们的目录结构 从图中可以看出每一个功能都有一个各自的文件夹 首先我们要自己先来创建一个数据,在Flask_data.py中写入如下内容: S ...

  4. mysql对库,表,数据类型的操作以及完整性约束

    一丶对库的操作 求救语法: help create database; 1.创建数据库 CREATE DATABASE 数据库名 charset utf8; 2.数据库的命名规则: 可以由字母.数字. ...

  5. zabbix-3.4-快速入门

    1 登陆和配置用户 登陆Zabbix,以及在Zabbix内建立一个系统用户. 用户名:Admin 或者 admin 密码 : zabbix 增加用户 可以在 管理(Administration) → ...

  6. mif文件生成方法

    mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.常见生成方法: Quartus自带的mif编辑器生成 mif软件生成 高级编程语 ...

  7. idea搭建ssm

    第一步:打开intellij idea,创建maven项目 参考:http://blog.csdn.net/w8897282/article/details/71173211  1.创建一个maven ...

  8. 工作流性能优化(敢问activiti有扩展性?)(3)

    2015/4/20 周末回去想了下,hibernate.mybatis.jdbc,都行,最终定了用mybatis,谁叫它这么优雅,acvtiviti是依赖了mybatis的,就不用再引入包了: 看了配 ...

  9. Angular4中常用管道

    通常我们需要使用管道实现对数据的格式化,Angular4中的管道和之前有了一些变化,下面说一些常用的管道. 一.大小写转换管道 uppercase将字符串转换为大写 lowercase将字符串转换为小 ...

  10. 【BZOJ1036】[ZJOI2008] 树的统计Count(一道可怕的模板题:树剖+线段树)

    点此看题面 题解 这真的只是一道模板题:一个树链剖分套上一个线段树(令我窒息的组合). 既然是模板题,那就直接上代码吧. 代码 #include<bits/stdc++.h> #defin ...