「POJ3237」Tree(树链剖分)
题意
给棵n个点的树。边有边权然后有三种操作
1、CHANGE i v 将编号为i的边权变为v
2、NEGATE a b 将a到b的所有边权变为相反数。
3、QUERY a b 查询a b路径的最大边权。
(n,q<=10000)
题解
树剖裸题。
边权下放。线段树记录最大值最小值即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int cnt,head[N];
int size[N],fa[N],dep[N],ww[N],son[N],ide[N];
int top[N],id[N],tot,w[N];
int t,n;
char s[];
struct edge{
int to,nxt,w,id;
}e[N*];
void add(int u,int v,int w,int id){
cnt++;
e[cnt].nxt=head[u];
e[cnt].to=v;
e[cnt].w=w;
e[cnt].id=id;
head[u]=cnt;
}
struct tree{
int l,r,maxx,minn,lazy;
}tr[N*];
void update(int now){
tr[now].maxx=max(tr[now*].maxx,tr[now*+].maxx);
tr[now].minn=min(tr[now*].minn,tr[now*+].minn);
}
void pushdown(int now){
if(tr[now].lazy==)return;
int hh=tr[now*].maxx;
tr[now*].maxx=-tr[now*].minn;
tr[now*].minn=-hh;
hh=tr[now*+].maxx;
tr[now*+].maxx=-tr[now*+].minn;
tr[now*+].minn=-hh;
tr[now*].lazy^=;
tr[now*+].lazy^=;
tr[now].lazy=;
}
void dfs1(int u,int f,int deep){
size[u]=;
fa[u]=f;
dep[u]=deep;
int maxson=-;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f)continue;
ww[v]=e[i].w;
ide[e[i].id]=v;
dfs1(v,u,deep+);
size[u]+=size[v];
if(size[v]>maxson){
son[u]=v;
maxson=size[v];
}
}
}
void dfs2(int u,int tp){
top[u]=tp;
id[u]=++tot;
w[tot]=ww[u];
if(!son[u])return;
dfs2(son[u],tp);
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u]||v==son[u])continue;
dfs2(v,v);
}
}
void build(int l,int r,int now){
tr[now].l=l;tr[now].r=r;
tr[now].maxx=tr[now].lazy=tr[now].minn=;
if(l==r){
tr[now].maxx=tr[now].minn=w[l];
return;
}
int mid=(l+r)>>;
build(l,mid,now*);
build(mid+,r,now*+);
update(now);
}
int getmax(int l,int r,int now){
pushdown(now);
if(tr[now].l==l&&tr[now].r==r){
return tr[now].maxx;
}
int mid=(tr[now].l+tr[now].r)>>;
if(l>mid)return getmax(l,r,now*+);
else if(r<=mid)return getmax(l,r,now*);
else {
return max(getmax(l,mid,now*),getmax(mid+,r,now*+));
}
}
void change(int x,int y,int now){
pushdown(now);
if(tr[now].l==tr[now].r){
tr[now].maxx=tr[now].minn=y;
return;
}
int mid=(tr[now].l+tr[now].r)>>;
if(x>mid)change(x,y,now*+);
else if(x<=mid)change(x,y,now*);
update(now);
}
void getfan(int l,int r,int now){
pushdown(now);
if(tr[now].l==l&&tr[now].r==r){
tr[now].lazy^=;
int hh=tr[now].maxx;
tr[now].maxx=-tr[now].minn;
tr[now].minn=-hh;
return;
}
int mid=(tr[now].l+tr[now].r)>>;
if(l>mid)getfan(l,r,now*+);
else if(r<=mid)getfan(l,r,now*);
else{
getfan(l,mid,now*);
getfan(mid+,r,now*+);
}
update(now);
}
int getlca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
x=fa[top[x]];
}
if(dep[x]<dep[y])return x;
else return y;
}
int getmaxl(int x,int y){
int ans=-;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,getmax(id[top[x]],id[x],));
x=fa[top[x]];
}
if(x==y)return ans;
if(dep[x]>dep[y])swap(x,y);
ans=max(ans,getmax(id[x]+,id[y],));
return ans;
}
void getfanl(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
getfan(id[top[x]],id[x],);
x=fa[top[x]];
}
if(x==y)return;
if(dep[x]>dep[y])swap(x,y);
getfan(id[x]+,id[y],);
}
int main(){
scanf("%d",&t);
for(int z=;z<=t;z++){
scanf("%d",&n);
memset(head,,sizeof(head));
memset(son,,sizeof(son));
memset(dep,,sizeof(dep));
memset(fa,,sizeof(fa));
memset(size,,sizeof(size));
memset(ide,,sizeof(ide));
memset(w,,sizeof(w));
memset(ww,,sizeof(ww));
memset(id,,sizeof(id));
memset(top,,sizeof(top));
tot=;
cnt=;
for(int i=;i<=n-;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w,i);
add(v,u,w,i);
}
dfs1(,,);
dfs2(,);
build(,n,);
while(scanf("%s",&s)!=EOF){
if(s[]=='D')break;
if(s[]=='Q'){
int x,y;
scanf("%d%d",&x,&y);
int LCA=getlca(x,y);
printf("%d\n",max(getmaxl(LCA,x),getmaxl(LCA,y)));
}
else if(s[]=='C'){
int x,y;
scanf("%d%d",&x,&y);
change(id[ide[x]],y,);
}
else if(s[]=='N'){
int x,y;
scanf("%d%d",&x,&y);
int LCA=getlca(x,y);
getfanl(LCA,x);
getfanl(LCA,y);
}
}
}
return ;
}
「POJ3237」Tree(树链剖分)的更多相关文章
- 【POJ3237】Tree 树链剖分+线段树
[POJ3237]Tree Description You are given a tree with N nodes. The tree's nodes are numbered 1 through ...
- 「HNOI2015」开店(树链剖分, 主席树)
/* 考虑将所求的值拆分 记每个点到根的路径长度为dis_i, 那么我们要求的就是\sum_{i = l} ^ r dis_i + dis[u] * (r - l + 1) - 2\sum_{i = ...
- POJ3237 Tree 树链剖分 边权
POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...
- Hdu 5274 Dylans loves tree (树链剖分模板)
Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...
- POJ3237 Tree 树链剖分 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - POJ3237 题意概括 Description 给你由N个结点组成的树.树的节点被编号为1到N,边被编号为1 ...
- 【POJ3237】【树链剖分】Tree
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- Query on a tree——树链剖分整理
树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...
- 【BZOJ-4353】Play with tree 树链剖分
4353: Play with tree Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 31 Solved: 19[Submit][Status][ ...
- SPOJ Query on a tree 树链剖分 水题
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
随机推荐
- sts安装出现could not find jar:file解决办法,could not find jar:file,sts安装
标题sts插件下载好但是安装出错 我的eclipse是4.5.2,在官方网站https://spring.io/tools3/sts/legacy下载,压缩包的名字为:spring-tool-suit ...
- 143.vector模板库
myvector.h #pragma once #include <initializer_list> #include <iostream> using namespace ...
- BZOJ 3165 李超线段树
思路: 李超线段树 我是把线段转成斜率的形式搞得 不知道有没有更简单的方法 //By SiriusRen #include <cmath> #include <cstdio> ...
- 忽略PyCharm4中特定的警告提示信息
有一种简单的方式忽略PyCharm4中的警告,光标放在下划线上,a. 等灯泡出现,点击灯泡或者b. 按下Alt和Enter键,选择'Ignore errors like this'. 或者,在设置里更 ...
- C#之Action和Func的用法(转自 https://www.cnblogs.com/LipeiNet/p/4694225.html)
以前我都是通过定义一个delegate来写委托的,但是最近看一些外国人写的源码都是用action和func方式来写,当时感觉对这很陌生所以看起源码也觉得陌生,所以我就花费时间来学习下这两种方式,然后发 ...
- PIC c语言
rom类型,对于占内存的类型定义为rom类型,跟标准c中的const不一样,const跟rom不能通用,否则编译会报type qualifier dismatch 有些变量定义成了rom型,那么如果改 ...
- lftp简单使用
连接服务器: lftp -e "参数;" "username":"password"@"ip" -p port lftp ...
- BZOJ2161: 布娃娃 整体二分
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <vecto ...
- ORACLE查询优化之is null和is not null优化
最近工作的时候遇到了比较大的数据查询,自己的sql在数据量小的时候没问题,在数据量达到300W的时候特别慢,只有自己优化sql了,以前没有优化过,所以记录下来自己的优化过程,本次是关于is null和 ...
- root of factory hierarchy
项目编译错误! project---->clean