题目描述

给定一个N个结点的无向树,树中的结点按照1...N编号,树中的边按照1...N − 1编号,每条边都赋予一个权值。你需要编写程序支持以下三种操作:
1.    CHANGE i v:将i号边的权值改为v
2.    NEGATE a b:将结点a到结点b路径上每条边权值取相反数。例如NEGATE(-3)=3,
NEGATE(3)=-3。
3.    QUERY a b:返回结点a到结点b路径上权值最大边的权值。

输入

第一行为N(≤ 105),代表树中结点的个数。
接下来− 1行,每行三个整数x y w表示有一条连接结点xy的边,权值为w
接下来若干行代表了三种操作。操作的格式见问题描述。遇到一行“DONE”时结束。
不会超过105个操作(不包含DONE)。
输入数据中有30%的数据,满足≤ 100。

输出

对于每个QUERY操作,输出一行,代表最大的权值。

样例输入

3 1 2 1 2 3 2 QUERY 1 2 CHANGE 1 3 QUERY 1 2 DONE

样例输出

1 3
 
题解:
树链剖分水题,但小测的时候打错了,发个博客以泄愤。
关键:线段树中不仅维护最大值又要维护最小值,然后取反就相当于swap(最小值,最大值).
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ls (node<<1)
#define rs (node<<1|1)
using namespace std;
const int N=,INF=;
int n;
int gi()
{
int str=,f=;char ch=getchar();
while(ch>'' || ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<='')str=str*+ch-'',ch=getchar();
return str*f;
}
int num=,head[N],haha[N];char s[];
struct TT{
int minn,maxn;
}Tree[N*];
int mark[N*];
struct Lin{
int next,to,dis;
}a[N*];
struct Edge{
int x,y,z;
}e[N];
void updata(int node){
Tree[node].maxn=Tree[ls].maxn>Tree[rs].maxn?Tree[ls].maxn:Tree[rs].maxn;
Tree[node].minn=Tree[ls].minn<Tree[rs].minn?Tree[ls].minn:Tree[rs].minn;
}
void init(int x,int y,int z)
{
a[++num].next=head[x];
a[num].to=y;
a[num].dis=z;
head[x]=num;
a[++num].next=head[y];
a[num].to=x;
a[num].dis=z;
head[y]=num;
}
int top[N],dep[N],id[N],son[N],fa[N],size[N],ids=;
void dfs1(int x)
{
int u;
size[x]=;
for(int i=head[x];i;i=a[i].next)
{
u=a[i].to;
if(dep[u])continue;
dep[u]=dep[x]+;fa[u]=x;
dfs1(u);
size[x]+=size[u];if(size[u]>size[son[x]])son[x]=u;
}
}
void dfs2(int x,int tp)
{
id[x]=++ids;top[x]=tp;
if(son[x])dfs2(son[x],tp);
int u;
for(int i=head[x];i;i=a[i].next){
u=a[i].to;
if(u==son[x] || u==fa[x])continue;
dfs2(u,u);
}
}
void build(int l,int r,int node)
{
mark[node]=;
if(l==r){Tree[node].maxn=Tree[node].minn=haha[l];return ;}
int mid=(l+r)>>;
build(l,mid,ls);
build(mid+,r,rs);
updata(node);
}
void pushdown(int node)
{
if(!mark[node])return ;
mark[ls]^=;mark[rs]^=;
swap(Tree[rs].maxn,Tree[rs].minn);Tree[ls].maxn*=-;Tree[ls].minn*=-;
swap(Tree[ls].maxn,Tree[ls].minn);Tree[rs].maxn*=-;Tree[rs].minn*=-;
mark[node]=;
}
void cg(int l,int r,int node,int sa,int se,int toit)
{
if(l>se || r<sa)return ;
if(sa<=l && r<=se){
if(toit==INF){mark[node]^=;swap(Tree[node].maxn,Tree[node].minn);Tree[node].maxn*=-;Tree[node].minn*=-;}
else {Tree[node].maxn=Tree[node].minn=toit;}
return ;
}
pushdown(node);
int mid=(l+r)>>;
cg(l,mid,ls,sa,se,toit);
cg(mid+,r,rs,sa,se,toit);
updata(node);
}
void Change(int x,int y){
cg(,n,,id[e[x].x],id[e[x].x],y);
}
void Negdata(int x,int y)
{
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
cg(,n,,id[top[x]],id[x],INF);
x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
cg(,n,,id[y]+,id[x],INF);
return ;
}
int getsum(int l,int r,int node,int sa,int se)
{
if(l>se || r<sa)return -INF;
if(sa<=l && r<=se)return Tree[node].maxn;
pushdown(node);
int mid=(l+r)>>;
return max(getsum(l,mid,ls,sa,se),getsum(mid+,r,rs,sa,se));
updata(node);
}
int Ask(int x,int y)
{
int ans=-INF,tmp;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
tmp=getsum(,n,,id[top[x]],id[x]);
if(tmp>ans)ans=tmp;
x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
tmp=getsum(,n,,id[y]+,id[x]);
return max(tmp,ans);
}
int main()
{
n=gi();
int x,y;
for(int i=;i<n;i++){
e[i].x=gi();e[i].y=gi();e[i].z=gi();
init(e[i].x,e[i].y,e[i].z);
}
dep[]=;dfs1();dfs2(,);fa[]=;haha[]=-INF;
for(int i=;i<n;i++){
x=e[i].x;y=e[i].y;
if(dep[x]<dep[y])swap(x,y),swap(e[i].x,e[i].y);
haha[id[x]]=e[i].z;
}
build(,n,);
while()
{
scanf("%s%d%d",s,&x,&y);
if(s[]=='D')break;
if(s[]=='C')Change(x,y);
else if(s[]=='N')Negdata(x,y);
else if(s[]=='Q')printf("%d\n",Ask(x,y));
}
return ;
}

【LSGDOJ1834 Tree】树链剖分的更多相关文章

  1. Hdu 5274 Dylans loves tree (树链剖分模板)

    Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...

  2. POJ3237 Tree 树链剖分 边权

    POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...

  3. Query on a tree——树链剖分整理

    树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...

  4. 【BZOJ-4353】Play with tree 树链剖分

    4353: Play with tree Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 31  Solved: 19[Submit][Status][ ...

  5. SPOJ Query on a tree 树链剖分 水题

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  6. poj 3237 Tree 树链剖分

    题目链接:http://poj.org/problem?id=3237 You are given a tree with N nodes. The tree’s nodes are numbered ...

  7. Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序

    Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...

  8. poj 3237 Tree 树链剖分+线段树

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

  9. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  10. CodeForces 916E Jamie and Tree(树链剖分+LCA)

    To your surprise, Jamie is the final boss! Ehehehe. Jamie has given you a tree with n vertices, numb ...

随机推荐

  1. 在VS2017下配置OpenGL

    这个方法适合初学者使用,较为简单方便. 第一,你的VS2017一定要安装了C/C++开发组件 可以打开Visual Studio Installer来查看 另外,确定你有安装NuGet包管理器,在单个 ...

  2. 201621123043 《Java程序设计》第2周学习总结

    1.本周学习总结 使用jdk文档查阅函数功能及代码 用switch语句是在每个case中可能在第一行是sc.nextLine;来给回车赋值: 在使用循环的时候要注意循环返回的条件,否则陷入死循环可能会 ...

  3. phalcon框架命名空间

    命名空间第一影像就是实际上就相当宏定义,就是需要把一个很长的带有路径的类文件指定一个空间,然后就可直接用简单简写模式 当然如果是外部文件需要首先引入外部文件,如果不引入外部文件还是会报错.一般最会出错 ...

  4. mingw打dll ,lib包命令和调用

    1,下面的命令行将这个代码编译成 dll. gcc mydll.c -shared -o mydll.dll -Wl,--out-implib,mydll.lib 其中 -shared 告诉gcc d ...

  5. ( 转 ) 聊一聊C#的Equals()和GetHashCode()方法

    聊一聊C#的Equals()和GetHashCode()方法   博客创建一年多,还是第一次写博文,有什么不对的地方还请多多指教. 关于这次写的内容可以说是老生长谈,百度一搜一大堆.大神可自行绕路. ...

  6. 新特性GTID

    什么是GTID 每提交一个事务,当前的执行过程都会拿到一个唯一的标识符,此标识符不仅对其源mysql 实列是唯一的而在给定的复制环境中的所有mysql 实列也是唯一的,所哟的事务与其GTID 之间都是 ...

  7. ajax中设置contentType: “application/json”的作用

    最近在做项目交互的时候,刚开始向后台传递数据返回415,后来百度添加了 contentType:"application/json"之后返回400,然后把传输的数据格式改为json ...

  8. mosquitto验证client互相踢

    cleint11A订阅topic#################################################### server发送topic消息 ############### ...

  9. LDAP apacheds解决方案

    Apache DS 配置与管理   LADP基本介绍 LDAP(轻量级目录访问协议)以目录的形式来管理资源(域用户,用户组,地址簿,邮件用户,打印机等等).   特点: 1. LDAP是一种网略协议而 ...

  10. Spring Security入门(2-1)Spring Security - 重要的过滤器

    1.自定义的filter机制 如果要对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP. Acegi对Web资源的保护,就是靠Filter实现的.Ace ...