QTREEⅠ SPOJ
树剖模板,注意把边化为点后要查到y的儿子。
#include<bits/stdc++.h>
using namespace std;
const int N=;
int f[N],bel[N],w[N],id[N],pos[N],d[N],size[N],son[N],head[N];
int n,idx,cnt,num,T,rt;
struct node
{
int l,r,s,mx;
void clean()
{
l=r=s=mx=-1e9;
}
}t[N<<];
struct edge
{
int to,nex,w,x;
}e[N<<],a[N];
void add(int x,int y,int w)
{
e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;e[cnt].x=x;
}
void dfs1(int x,int fa)
{
size[x]=;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==fa)continue;
f[y]=x;d[y]=d[x]+;
dfs1(y,x);
if(size[y]>size[son[x]])son[x]=y;
size[x]+=size[y];
}
return;
}
void dfs2(int x,int chain)
{
bel[x]=chain;pos[x]=++idx;id[idx]=x;
if(son[x])dfs2(son[x],chain);
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==f[x]||y==son[x])continue;
dfs2(y,y);
}
}
void build(int &x,int l,int r)
{
x=++num;
if(l==r){
t[x].s=t[x].mx=w[l];return;
}
int mid=l+r>>;
build(t[x].l,l,mid);build(t[x].r,mid+,r);
t[x].mx=max(t[t[x].l].mx,t[t[x].r].mx);
return;
}
int query(int x,int l,int r,int L,int R)
{
if(l==L&&r==R)return t[x].mx;
int mid=l+r>>;
if(R<=mid)return query(t[x].l,l,mid,L,R);
else if(L>mid)return query(t[x].r,mid+,r,L,R);
else return max(query(t[x].l,l,mid,L,mid),query(t[x].r,mid+,r,mid+,R));
}
void change(int x,int l,int r,int pos,int ww)
{
if(l==r){t[x].s=t[x].mx=ww;return;}
int mid=l+r>>;
if(pos<=mid)change(t[x].l,l,mid,pos,ww);
else change(t[x].r,mid+,r,pos,ww);
t[x].mx=max(t[t[x].l].mx,t[t[x].r].mx);
}
int querytree(int x,int y)
{
int ans=-1e9;
while(bel[x]!=bel[y])
{
if(d[bel[x]]<d[bel[y]])swap(x,y);
ans=max(ans,query(rt,,n,pos[bel[x]],pos[x]));
x=f[bel[x]];
}
if(d[x]<d[y])swap(x,y);
if(d[son[y]]<=d[x])
ans=max(ans,query(rt,,n,pos[son[y]],pos[x]));
return ans;
}
void init()
{
memset(f,,sizeof(f));
memset(d,,sizeof(d));
memset(size,,sizeof(size));
memset(son,,sizeof(son));
memset(bel,,sizeof(bel));
memset(pos,,sizeof(pos));
memset(head,,sizeof(head));
memset(id,,sizeof(id));
memset(w,,sizeof(w));cnt=idx=num=;rt=;
for(int i=;i<=num;++i)t[i].clean();
}
int main()
{
scanf("%d",&T);
while(T--)
{
init();int x,y,ww;
scanf("%d",&n);
for(int i=;i<n;++i)
{
scanf("%d%d%d",&x,&y,&ww);
add(x,y,ww);add(y,x,ww);
a[i].x=x;a[i].to=y;a[i].w=ww;
}
dfs1(,);dfs2(,);
build(rt,,n);char s[];
for(int i=;i<n;i++)
{
x=d[a[i].x]>d[a[i].to]?a[i].x:a[i].to;
change(rt,,n,pos[x],a[i].w);
}
change(rt,,n,pos[],-1e9);
while()
{
scanf("%s",s);
if(s[]=='D')break;
if(s[]=='Q')
{
scanf("%d%d",&x,&y);
printf("%d\n",querytree(x,y));
}
else
{
scanf("%d%d",&x,&y);
x=d[a[x].x]>d[a[x].to]?a[x].x:a[x].to;
change(rt,,n,pos[x],y);
}
}
}
return ;
}
QTREEⅠ SPOJ的更多相关文章
- QTREE 树链剖分---模板 spoj QTREE
<树链剖分及其应用> 一文讲得非常清楚,我一早上就把他学会了并且A了这题的入门题. spoj QTREE 题目: 给出一棵树,有两种操作: 1.修改一条边的边权. 2.询问节点a到b的最大 ...
- SPOJ QTREE 系列解题报告
题目一 : SPOJ 375 Query On a Tree http://www.spoj.com/problems/QTREE/ 给一个树,求a,b路径上最大边权,或者修改a,b边权为t. #in ...
- SPOJ QTREE Query on a tree 树链剖分+线段树
题目链接:http://www.spoj.com/problems/QTREE/en/ QTREE - Query on a tree #tree You are given a tree (an a ...
- spoj QTREE - Query on a tree(树链剖分+线段树单点更新,区间查询)
传送门:Problem QTREE https://www.cnblogs.com/violet-acmer/p/9711441.html 题解: 树链剖分的模板题,看代码比看文字解析理解来的快~~~ ...
- SPOJ QTREE
QTREE /* 题目大意:维护一棵树,允许修改边权以及查询链上最大值 题解:我们将边权转为点权,标记在深度较深的点上,树链剖分后用线段树处理即可 */ #include <cstdio> ...
- SPOJ 375 Query on a tree(树链剖分)(QTREE)
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
- SPOJ QTREE Query on a tree ——树链剖分 线段树
[题目分析] 垃圾vjudge又挂了. 树链剖分裸题. 垃圾spoj,交了好几次,基本没改动却过了. [代码](自带常数,是别人的2倍左右) #include <cstdio> #incl ...
- 【学术篇】SPOJ QTREE 树链剖分
发现链剖这东西好久不写想一遍写对是有难度的.. 果然是熟能生巧吧.. WC的dalao们都回来了 然后就用WC的毒瘤题荼毒了我们一波, 本来想打个T1 44分暴力 然后好像是特判写挂了还是怎么的就只能 ...
- SPOJ QTree【树链剖分】
一 题目 QTREE 二 分析 第一道树链剖分的题,写的好艰难啊. 题意还是比较好理解的,就是在树上操作. 对于修改,题中要求的是单点修改,就算是直接树上操作也是非常简单的. 对于查询,查询的时候,是 ...
随机推荐
- 在asp.net中使用加密数据库联接字符串
在我们发布网站时,加密web.config,这样可以有效保证数据库用户和密码安全,其步骤如下: 1.添加密钥 执行:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50 ...
- HDU 5914 Triangle 斐波纳契数列 && 二进制切金条
HDU5914 题目链接 题意:有n根长度从1到n的木棒,问最少拿走多少根,使得剩下的木棒无论怎样都不能构成三角形. 题解:斐波纳契数列,a+b=c恰好不能构成三角形,暴力就好,推一下也可以. #in ...
- SDUT 3928
Description C~K 和 PBH 经常玩一个游戏.游戏规则如下:现给定一个 n*n 的棋盘,一个石头被放在棋盘的左上角. 他们轮流移动石头.每一回合,两个人只能把石头向上,下,左,右四个方向 ...
- 7.Python3标准库--文件系统
''' Python的标准库中包含大量工具,可以处理文件系统中的文件,构造和解析文件名,还可以检查文件内容. 处理文件的第一步是要确定处理的文件的名字.Python将文件名表示为简单的字符串,另外还提 ...
- linux下查看资源使用情况
//查看占用内存最多的前K的程序ps aux | sort -k4nr | head -K //查看占用CPU最多的前K的程序 ps aux | sort -k3nr | head -K
- Codeforces 813B The Golden Age(数学+枚举)
题目大意:如果一个数t=x^a+y^b(a,b都是大于等于0的整数)那就是一个unlucky数字.给你x,y,l,r(2 ≤ x, y ≤ 10^18, 1 ≤ l ≤ r ≤ 10^18),求出l到 ...
- 转载--void指针(void *的用法)
转自:jimmy 指针有两个属性:指向变量/对象的地址和长度 但是指针只存储地址,长度则取决于指针的类型 编译器根据指针的类型从指针指向的地址向后寻址 指针类型不同则寻址范围也不同,比如: int*从 ...
- DB2和Oracle中Date比较
- 编译报错:LC.exe 已退出
- 重记解决kube-dns故障一则---ceph惹的祸
上次,在同一个k8s集群里安装完ceph进行功能测试. 当测试完成之后,我停止了ceph的程序,再重新启动k8s集群. 结果,有一个应用就出问题了. 后来查出是因为防火墙里 Chain FORWARD ...