【LSGDOJ1834 Tree】树链剖分
题目描述
输入
输出
样例输入
样例输出
#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】树链剖分的更多相关文章
- Hdu 5274 Dylans loves tree (树链剖分模板)
Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...
- POJ3237 Tree 树链剖分 边权
POJ3237 Tree 树链剖分 边权 传送门:http://poj.org/problem?id=3237 题意: n个点的,n-1条边 修改单边边权 将a->b的边权取反 查询a-> ...
- 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, ...
- poj 3237 Tree 树链剖分
题目链接:http://poj.org/problem?id=3237 You are given a tree with N nodes. The tree’s nodes are numbered ...
- Codeforces Round #200 (Div. 1) D Water Tree 树链剖分 or dfs序
Water Tree 给出一棵树,有三种操作: 1 x:把以x为子树的节点全部置为1 2 x:把x以及他的所有祖先全部置为0 3 x:询问节点x的值 分析: 昨晚看完题,马上想到直接树链剖分,在记录时 ...
- poj 3237 Tree 树链剖分+线段树
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- 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 ...
- 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 ...
随机推荐
- 每日冲刺报告——Day4(Java-Team)
第四天报告(11.5 周日) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...
- 算法——算法时间复杂度的计算和大O阶的推导
在算法分析中,我们将语句总的执行次数记为T(n)进而分析T(n)随n的变化情况确认T(n)的数量级.一般情况下,T(n)随n增大变化最缓慢的算法为最优算法. 根据定义,T(n)的求法是很简单的,也就是 ...
- iOS中滤镜种类及相关介绍
- 基于Unity·UGUI实现的RecycleList循环列表UI容器
在UI功能开发实践中,列表UI容器是我们经常使用一种UI容器组件.这种组件就根据输入的数据集合生成对应数据项目.从显示的方向来说,一般就分为水平排布和垂直排布的列表容器两种.列表容器为了在有限的界面空 ...
- caffe实现GAN
我实现GAN网络结构比较复杂: 通过建立两个一模一样的网络,他们相对应的层共享权重,一个网络用来跟新D model另一个网络用来更新G model 更新G model的网络,D部分只进行梯度传递,不进 ...
- 不高兴的小名 nyoj
不高兴的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 小明又出问题了.妈妈认为聪明的小明应该更加用功学习而变的更加厉害,所以小明除了上学之外,还要参加妈 ...
- mui 页面无法下滑拖拽 主要体现在华为手机浏览器
项目做到中期遇到一个问题,华为手机有些页面显示不全且无法下滑. 因为之前一直用的Google浏览器的模拟模式进行开发和调试的,一直未发现这个问题. 刚开始 选用mui的下拉刷新上拉加载的方式来进行页面 ...
- python hashlib、hmac模块
一.hashlib模块 import hashlib m = hashlib.md5() m.update(b"Hello") print(m.hexdigest()) m.upd ...
- Postgres中postmaster代码解析(上)
之前我的一些文章都是在说Postgres的一些查询相关的代码.但是对于Postgres服务端是如何启动,后台进程是如何加载,服务端在哪里以及如何监听客户端的连接都没有一个清晰的逻辑.那么今天我来说说P ...
- GIT入门笔记(1)- Git的基本概念
一.概念和定义 1.git是什么 许多人习惯用复制整个项目目录的方式来保存不同的项目版本,或许还会改名加上备份时间以示区别.这么做唯一的好处就是简单.不过坏处也不少:有时候会混淆所在的工作目录,一旦弄 ...