POJ2763 Housewife Wind(DFS序)

时间:2022-09-30 21:10:13

题目:单边修改,树链查询。

这题是边权,不是点权,不过也可以看作是点权。

然后其实就和BZOJ2819一样。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 111111
struct Edge{
int u,v,w,nxt;
}edge[MAXN<<];
int n,head[MAXN],NE;
void addEdge(int u,int v,int w){
edge[NE].u=u; edge[NE].v=v; edge[NE].w=w; edge[NE].nxt=head[u]; head[u]=NE++;
}
int odr,l[MAXN],r[MAXN],stack[MAXN],sum[MAXN],fa[][MAXN],dep[MAXN];
void dfs(){
int top=;
stack[++top]=;
while(top){
int u=stack[top];
if(l[u]){
r[u]=odr; --top;
continue;
}
l[u]=++odr;
for(int i=head[u]; i!=-; i=edge[i].nxt){
int v=edge[i].v;
if(fa[][u]==v) continue;
fa[][v]=u; dep[v]=dep[u]+; sum[v]=sum[u]+edge[i].w;
stack[++top]=v;
}
}
} int N,tree[MAXN<<],x,y,z;
void update(int i,int j,int k){
if(x<=i && j<=y){
tree[k]+=z;
return;
}
if(tree[k]){
tree[k<<]+=tree[k]; tree[k<<|]+=tree[k];
tree[k]=;
}
int mid=i+j>>;
if(x<=mid) update(i,mid,k<<);
if(y>mid) update(mid+,j,k<<|);
}
int query(int i,int j,int k){
if(i==j) return tree[k];
if(tree[k]){
tree[k<<]+=tree[k]; tree[k<<|]+=tree[k];
tree[k]=;
}
int mid=i+j>>;
if(x<=mid) return query(i,mid,k<<);
return query(mid+,j,k<<|);
}
int lca(int u,int v){
if(dep[u]>dep[v]) swap(u,v);
for(int k=; k<; ++k){
if((dep[v]-dep[u])>>k&){
v=fa[k][v];
}
}
if(v==u) return u;
for(int k=; k>=; --k){
if(fa[k][u]!=fa[k][v]){
u=fa[k][u];
v=fa[k][v];
}
}
return fa[][u];
}
void init(){
dfs();
for(int i=; i<; ++i){
for(int j=; j<=n; ++j){
int t=fa[i-][j];
fa[i][j]=fa[i-][t];
}
}
for(N=; N<odr; N<<=);
for(int i=; i<=n; ++i){
x=l[i]; y=l[i]; z=sum[i];
update(,N,);
}
} int main(){
int q,s,op,a,b,c;
memset(head,-,sizeof(head));
scanf("%d%d%d",&n,&q,&s);
for(int i=; i<n; ++i){
scanf("%d%d%d",&a,&b,&c);
addEdge(a,b,c);
addEdge(b,a,c);
}
init();
while(q--){
scanf("%d",&c);
if(c){
scanf("%d%d",&a,&b);
Edge &e=edge[a-<<];
if(fa[][e.u]==e.v){
x=l[e.u]; y=r[e.u]; z=b-e.w;
}else{
x=l[e.v]; y=r[e.v]; z=b-e.w;
}
e.w=b;
update(,N,);
}else{
scanf("%d",&a);
int res;
x=l[a]; res=query(,N,);
x=l[s]; res+=query(,N,);
x=l[lca(a,s)]; res-=(query(,N,)<<);
s=a;
printf("%d\n",res);
}
}
return ;
}

POJ2763 Housewife Wind(DFS序)的更多相关文章

  1. POJ2763 Housewife Wind 树链剖分 边权

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

  2. POJ2763 Housewife Wind

      Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 9701   Accepted: 2661 Description Aft ...

  3. 【lct】poj2763 Housewife Wind

    题意:给你一棵树,边带权,支持两种操作:修改某条边的权值:查询两点之间的最短路. lct主要实现单点修改和路径和. 修改x结点的值只需将x Splay到其所在辅助树的根,然后修改其值,再maintai ...

  4. POJ2763 Housewife Wind&lpar;树剖&plus;线段树&rpar;

    After their royal wedding, Jiajia and Wind hid away in XX Village, to enjoy their ordinary happy lif ...

  5. Housewife Wind

    Housewife Wind 参考博客:POJ2763 Housewife Wind(树剖+线段树) 差不多是直接套线段树+树剖的板子,但是也有一些需要注意的地方 建树: void build() { ...

  6. POJ 2763 Housewife Wind(DFS序&plus;LCA&plus;树状数组)

    Housewife Wind Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 11419   Accepted: 3140 D ...

  7. POJ 2763&quot&semi;Housewife Wind&quot&semi;(DFS序&plus;树状数组&plus;LCA)

    传送门 •题意 一对夫妇居住在 xx村庄,给村庄有 $n$ 个小屋: 这 $n$ 个小屋之间有双向可达的道路,不会出现环,即所构成的图是个树: 从 $a_i$ 小屋到 $b_i$ 小屋需要花费 $w_ ...

  8. B - Housewife Wind POJ - 2763 树剖&plus;边权转化成点权

    B - Housewife Wind POJ - 2763 因为树剖+线段树只能解决点权问题,所以这种题目给了边权的一般要转化成点权. 知道这个以后这个题目就很简单了. 怎么转化呢,就把这个边权转化为 ...

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

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

随机推荐

  1. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  2. Linux 常用操作命令

    基本操作 显示 查看 查找 定时任务 打包压缩 grep sed awk 正则

  3. MySQL绿色版安装(mysql-5&period;7&period;12-win32)

    1. 从官网下载安装包:mysql-5.7.12-win32.zip 2. 解压到C盘(任意盘符都行) C:\mysql-5.7.12-win32 3. 修改配置文件:C:\mysql-5.7.12- ...

  4. python数据类型之dict

    1.clear:删除所有元素 #D.clear() -> None. Remove all items from D dic_a ={:::'gen'} dic_a.clear() print( ...

  5. &lbrack;转载&rsqb; 问题解决:FFmpeg视频编解码库,无法解析的外部信号

    在编译FFmpeg相关项目时,可能会出现: error LNK2019: 无法解析的外部符号 "int __cdecl avpicture_fill(struct AVPicture *,u ...

  6. 【转】Android属性之build&period;prop,及property&lowbar;get&sol;property&lowbar;set

    简要分析一下build.prop是如何生成的.Android的build.prop文件是在Android编译时收集的各种property(LCD density/语言/编译时间, etc.),编译完成 ...

  7. python的二维数组操作

    需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0] ...

  8. Linux学习(十二)mkpasswd、su、sudo、限制root远程登录

    一.mkpasswd mkpasswd用来生成随机密码字符串.可以指定长度和特殊字符的长度: [root@ruanwenwu01 ~]# mkpasswd O7.alw5Wq [root@ruanwe ...

  9. 用户信息文件&sol;etc&sol;passwd,影子文件&sol;etc&sol;shadow,组信息文件&sol;etc&sol;group,组密码文件&sol;etc&sol;gshadow,用户管理相关文件

    /etc/passwd man 5 passwd查看配置文件信息 account:password:UID:GID:GECOS:directory:shell 帐号:密码:用户ID:组ID:一般的信息 ...

  10. iview安装使用

    iView 是一套基于 Vue.js 的开源 UI 组件库,主要服务于 PC 界面的中后台产品. 安装 cd 项目 cnpm install iview -S 在项目中引入iview 在入口文件mai ...