poj2763
//Accepted 11676 KB 2344 ms
/*
source:poj2763
time :2015.5.29
by :songt
*/
/*题解:
树链剖分
基于边权,路径查询
wind第一次在s节点,假如她走到了p节点,那么下次开始的时候他就在p节点
*/
#include <cstdio>
#include <cstring>
;
struct Edge
{
int u,v;
Edge(){}
Edge(int u,int v):u(u),v(v){}
}edge[*imax_n];
int head[imax_n];
*imax_n];
int tot;
void addEdge(int u,int v)
{
edge[tot]=Edge(u,v);
next[tot]=head[u];
head[u]=tot++;
}
int fa[imax_n],deep[imax_n],num[imax_n],son[imax_n];
int p[imax_n],fp[imax_n],top[imax_n];
int pos;
void init()
{
memset(head,-,sizeof(head));
memset(next,-,sizeof(next));
tot=;
memset(son,-,sizeof(son));
pos=;
}
int s[imax_n];
int cnt_s;
int vis[imax_n];
void dfs1(int u)
{
fa[u]=;
deep[u]=;
cnt_s=;
s[cnt_s++]=u;
memset(vis,,sizeof(vis));
while (cnt_s)
{
];
if (vis[x])
{
cnt_s--;
if (x!=u)
{
num[fa[x]]+=num[x];
|| num[fa[x]]<num[x])
son[fa[x]]=x;
}
continue;
}
vis[x]=;
num[x]=;
;i=next[i])
{
int v=edge[i].v;
if (v!=fa[x])
{
fa[v]=x;
deep[v]=deep[x]+;
s[cnt_s++]=v;
}
}
}
}
void dfs2(int u)
{
top[u]=u;
memset(vis,,sizeof(vis));
cnt_s=;
s[cnt_s++]=u;
while (cnt_s)
{
];
if (vis[x])
{
cnt_s--;
continue ;
}
vis[x]=;
p[x]=pos++;
fp[p[x]]=x;
) continue ;
;i=next[i])
{
int v=edge[i].v;
if (v!=fa[x] && v!=son[x])
{
top[v]=v;
s[cnt_s++]=v;
}
}
top[son[x]]=top[x];
s[cnt_s++]=son[x];
}
}
struct Tree
{
int l,r;
long long sum;
}f[imax_n*];
void build(int t,int l,int r)
{
f[t].l=l;
f[t].r=r;
f[t].sum=;
if (l==r)
{
return ;
}
;
build(*t,l,mid);
build(*t+,mid+,r);
}
void update(int t,int k,int value)
{
if (f[t].l==k && f[t].r==k)
{
f[t].sum=value;
return ;
}
;
*t,k,value);
*t+,k,value);
f[t].sum=f[*t].sum+f[*t+].sum;
}
long long query(int t,int l,int r)
{
if (f[t].l==l && f[t].r==r)
{
return f[t].sum;
}
;
*t,l,r);
else
{
*t+,l,r);
*t,l,mid)+query(*t+,mid+,r);
}
}
void swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
long long find(int u,int v)
{
int f1=top[u],f2=top[v];
;
while (f1!=f2)
{
if (deep[f1]<deep[f2])
{
swap(f1,f2);
swap(u,v);
}
sum+=query(,p[f1],p[u]);
u=fa[f1];
f1=top[u];
}
if (u==v) return sum;
if (deep[u]>deep[v]) swap(u,v);
sum+=query(,p[son[u]],p[v]);
return sum;
}
];
int n,m;
int res;
int main()
{
)
//scanf("%d%d%d",&n,&m,&res);
{
init();
;i<n-;i++)
{
scanf(],&e[i][],&e[i][]);
addEdge(e[i][],e[i][]);
addEdge(e[i][],e[i][]);
}
dfs1();
dfs2();
build(,,pos-);
;i<n-;i++)
{
]]<deep[e[i][]]) swap(e[i][],e[i][]);
update(,p[e[i][]],e[i][]);
}
int kind;
int u,v;
;i<m;i++)
{
scanf("%d",&kind);
)
{
scanf("%d",&u);
printf("%lld\n",find(u,res));
res=u;
}
else
{
scanf("%d%d",&u,&v);
update(,p[e[u-][]],v);
}
}
}
;
}
poj2763的更多相关文章
- 【lct】poj2763 Housewife Wind
题意:给你一棵树,边带权,支持两种操作:修改某条边的权值:查询两点之间的最短路. lct主要实现单点修改和路径和. 修改x结点的值只需将x Splay到其所在辅助树的根,然后修改其值,再maintai ...
- poj2763(树链剖分 - 边权)
poj2763 题意 给定一个树形图,某人原来在 s 点,每条边(路)有通过的时间花费,有两种操作:1. 查询某人到 u 点花费的时间 2. 更新某条路的时间花费. 分析 权值在边上,可以把它们 &q ...
- POJ2763 Housewife Wind 树链剖分 边权
POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...
- POJ2763 Housewife Wind
Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 9701 Accepted: 2661 Description Aft ...
- poj2763 树链剖分(线段树)
注意这里都是把边放到线段树中,所以lca的时候,要注意如果top[x]==top[y] && x==y 的时候已经完成了. 仔细想想边和点的不同之处!!! #include<ma ...
- POJ2763 Housewife Wind(DFS序)
题目:单边修改,树链查询. 这题是边权,不是点权,不过也可以看作是点权. 然后其实就和BZOJ2819一样. #include<cstdio> #include<cstring> ...
- poj2763(树链剖分)
题目链接:http://poj.org/problem?id=2763 题意:定一棵带边权的树,要求支持两种操作:1)询问树中某两点间的距离. 2)修改某条边的权值. 分析:树链剖分,边权修改,路径求 ...
- 树链剖分——边权poj2763
边权操作起来也和点权一样,只要把边的权值映射到点上即可,要注意的地方是向上爬的过程中和点权不太一样,还有个特判(WA了几次..) 完整代码 #include<cstring> #inclu ...
- poj2763树链剖分边权+区间和
自己写的比原来的板子常数小了不少嘻嘻,边权处理起来比点权要复杂一下 由于根节点没有被映射的边,其被访问到的顺序是0,直接排除在线段树外 #include<iostream> #includ ...
随机推荐
- http响应需要记住的状态码
200:请求成功. 301:被请求的资源已永久移动到新位置.302:请求的资源现在临时从不同的 URI 响应请求.401:当前请求需要用户验证.403:服务器已经理解请求,但是拒绝执行它. 404:请 ...
- linux指令(一)文件的操作
ls -i 查看文件的inode号 find ./ inum 1651190 -exec rm -i {} \; 根据inode号删除文件
- centos6.5下安装qq2012
大家如果想在linux下用QQ的话,最好的方法就是用wine来安装.腾讯的QQ for linux用起来很坑爹. 下面就是我用wine在centOS下安装QQ.中间过程很简单. 一.安装Wine. 1 ...
- How to Make Terrains in Tiled Map Editor
Published July 13th, 2015 by Stephen Gygi How to Make Terrains in Tiled Map Editor http://www.binary ...
- table表格中的内容溢出布局方式
什么是内容溢出呢?其实就是当文字很多的时候,如果内容区域只有那么长,那么多出的部分以点点点代替. 这次做的案例是在table里面,我们知道当我们在table里输入过多的文字内容的时候会撑乱表格,例如一 ...
- Jmeter性能测试入门(链接收藏)
Jmeter性能测试入门: http://www.cnblogs.com/TankXiao/p/4045439.html
- [转+整理] Android 分辨率,密度,像素单位说明
Android支持下列所有单位: px(像素):屏幕上的一个点.不同设备显示效果相同,一般我们HVGA代表320×480像素,这个用的比较多.in(英寸):长度单位.mm(毫米):长度单位.pt(磅) ...
- 微博开放平台开发(一)获取access_token
因为工作需要,接触到微博开放平台开发.特做此记录方便查用. 一.准备. 1.微博账号.注册很容易. 2.微博账号成为开发者. 登录微博开放平台 登录你注册的账号,然后进入管理中心完善开发者基本信息和 ...
- PDF 补丁丁 0.5.0.2520 测试版发布:新春快乐!
新的PDF测试版今天发布了. 新的测试版比旧测试版本增加了如下功能: 合并文件功能可以导出.导入文件列表,方便合并大量文件.一天干不完,保存一下,明天继续来. 合并文件功能可以统一已合并文件的旋转方向 ...
- AutoCAD学习笔记
学习笔记: **有些命令,有两到三种执行方式:菜单.命令行.对话框.如layer命令,如果在命令行打入layer命令,就会弹出对话框主y式,如果要命令行方式执行,就需要在前面加一个-号,即-layer ...