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 二 分析 第一道树链剖分的题,写的好艰难啊. 题意还是比较好理解的,就是在树上操作. 对于修改,题中要求的是单点修改,就算是直接树上操作也是非常简单的. 对于查询,查询的时候,是 ...
随机推荐
- 【BZOJ】1537: [POI2005]Aut- The Bus
[算法]DP+线段树求区间max(二维偏序) [题解] 状态转移方程:f[i]=max(f[j]+v[i]),x[j]<x[i]&&y[j]<y[i]. 观察j的条件限制显 ...
- 【CodeForces】947 C. Perfect Security 异或Trie
[题目]C. Perfect Security [题意]给定长度为n的非负整数数组A和数组B,要求将数组B重排列使得A[i]^B[i]的字典序最小.n<=3*10^5,time=3.5s. [算 ...
- Java生成验证码简记
验证码定义 验证码(captcha):是一种区分用户是计算机还是人的公共全自动程序. 作用:可以防止恶意破解密码.刷票.灌水,有效防止对某一个特定注册用户用特定程序进行暴力破解的登录尝试. 验证码交互 ...
- python模块之imghdr检测图片类型
1. imghdr是什么 imghdr是一个用来检测图片类型的模块,传递给它的可以是一个文件对象,也可以是一个字节流. 能够支持的图片格式: 2. 如何使用 提供了一个api叫做imghdr.what ...
- 树的直径(两个bfs)
题目链接:https://cn.vjudge.net/problem/POJ-2631 树的直径:树中的最长链 具体思路:随便找一个点bfs,然后找到最长的链,然后再以找到的点作为起点进行bfs,然后 ...
- PHP非常好用的分页类
分页类: <?php /* * ********************************************* * @类名: page * @参数: $myde_total - 总记 ...
- weblogic nmap扫描脚本
CVE-2018-2894 / Nmap利用脚本,可批量批量快速扫描getshell.检测漏洞.利用漏洞 地址:https://github.com/Rvn0xsy/nse_vuln/tree/ma ...
- Java并发编程(二)
1.Lock接口 在Lock接口出现之前,Java程序是靠synchronized关键字实 ...
- 【Python学习】request库
Requests库(https://www.python-requests.org/)是一个擅长处理那些复杂的HTTP请求.cookie.header(响应头和请求头)等内容的Python第三方库. ...
- Android :ExpandableListActivity
http://developer.android.com/reference/android/app/ExpandableListActivity.html# public class Expanda ...