hdu3804(树链剖分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3804
题意:给定一棵n个结点的树及边权,回答m个询问(x,y)满足以下条件的边权:
1)该边在结点1~x的路径上。
2)在1~x的路径上小于等于y的最大边权。
分析:离线处理,将边权和询问的y值按从小到大排序,然后逐序将边权插入线段树中,每次查询当前条件下路径上的最大值(线段树维护)就是答案。。。
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 10007
#define inf 0x3f3f3f3f
#define N 100010
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
struct edge
{
int to,next;
edge(){}
edge(int to,int next):to(to),next(next){}
}e[N<<];
int head[N<<],tot;
int top[N];//top[v]表示v所在的重链的顶端节点
int fa[N];//父亲节点
int dep[N];//深度
int sz[N];//si[v]表示以v为根节点的子树的节点数
int son[N];//重儿子
int p[N];//p[v]表示v与其父亲节点的连边在线段树中的位置
int fp[N];//与p数组相反
int pos;//所有链构成的线段树总长度
int mx[N<<];
struct Edge
{
int u,v,w,id;
bool operator<(const Edge &a)const
{
return w<a.w;
}
}E[N<<];
struct Query
{
int x,y,id;
bool operator<(const Query &a)const
{
return y<a.y;
}
}q[N];
void addedge(int u,int v)
{
e[tot]=edge(v,head[u]);
head[u]=tot++;
}
void init()
{
tot=;FILL(head,-);
pos=;FILL(son,-);
}
void dfs(int u,int f,int d)
{
sz[u]=;dep[u]=d;fa[u]=f;
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].to;
if(v==f)continue;
dfs(v,u,d+);
sz[u]+=sz[v];
if(son[u]==-||sz[son[u]]<sz[v])son[u]=v;
}
}
void getpos(int u,int sp)
{
top[u]=sp;
p[u]=++pos;
fp[pos]=u;
if(son[u]==-)return;
getpos(son[u],sp);
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].to;
if(v!=son[u]&&v!=fa[u])
{
getpos(v,v);
}
}
}
void Pushup(int rt)
{
int ls=rt<<,rs=ls|;
mx[rt]=max(mx[ls],mx[rs]);
}
void update(int ps,int c,int l,int r,int rt)
{
if(l==r)
{
mx[rt]=c;
return;
}
int m=(l+r)>>;
if(ps<=m)update(ps,c,lson);
else update(ps,c,rson);
Pushup(rt);
}
int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
return mx[rt];
int m=(l+r)>>;
int res=-inf;
if(L<=m)res=max(res,query(L,R,lson));
if(m<R)res=max(res,query(L,R,rson));
return res;
}
int lca(int u,int v)
{
int fu=top[u],fv=top[v];
int res=-;
while(fu!=fv)
{
if(dep[fu]<dep[fv])
{
swap(fu,fv);swap(u,v);
}
res=max(res,query(p[fu],p[u],,pos,));
u=fa[fu];fu=top[u];
}
if(dep[u]>dep[v])swap(u,v);
if(u!=v)
res=max(res,query(p[son[u]],p[v],,pos,));
return res;
}
int ans[N];
int main()
{
int T,n,m,x,y;
int a,b,c;
scanf("%d",&T);
while(T--)
{
init();
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
addedge(a,b);
addedge(b,a);
E[i].u=a;E[i].v=b;
E[i].w=c;E[i].id=i;
}
dfs(,,);
getpos(,);
for(int i=;i<n;i++)
if(dep[E[i].u]>dep[E[i].v])
swap(E[i].u,E[i].v);
sort(E+,E+n);
scanf("%d",&m);
for(int i=;i<m;i++)scanf("%d%d",&q[i].x,&q[i].y),q[i].id=i;
sort(q,q+m);FILL(mx,-);
for(int j=,i=;i<m;i++)
{
while(j<n&&E[j].w<=q[i].y)
{
update(p[E[j].v],E[j].w,,pos,);
j++;
}
ans[q[i].id]=lca(,q[i].x);
}
for(int i=;i<m;i++)printf("%d\n",ans[i]);
}
}
hdu3804(树链剖分)的更多相关文章
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)
题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...
- 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)
题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...
- 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)
题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...
- bzoj2243树链剖分+染色段数
终于做了一道不是一眼出思路的代码题(⊙o⊙) 之前没有接触过这种关于染色段数的题目(其实上课好像讲过),于是百度了一下(现在思维能力好弱) 实际上每一段有用的信息就是总共有几段和两段各是什么颜色,在开 ...
- bzoj3631树链剖分
虽然是水题1A的感觉太爽了O(∩_∩)O~ 题意相当于n-1次树上路径上每个点权值+1,最后问每个点的权值 本来想写线段树,写好了change打算框架打完了再来补,结果打完发现只是区间加和单点查 前缀 ...
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- BZOJ 2243: [SDOI2011]染色 [树链剖分]
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6651 Solved: 2432[Submit][Status ...
随机推荐
- HTML语言简单回顾
简单复习一下html语言. html的基本结构如下: <html> <head> <title></title> </head> <b ...
- androidstudio 优化gradle编译效率
androidstuido 使用gradle自己主动构建和编译.有时做少量改动编译须要等待时间过长,近期Erik Hellman编写的Boosting the performance for Grad ...
- TEXT文本编辑框2
Result: When you double clicks on the TextEdit control nothing happens, since the flow-logic of the ...
- treeview树形菜单,递归
我使用的是递归是实现无限级树形菜单: using System; using System.Collections; using System.Configuration; using System. ...
- 新秀操作和维护注意事项:Windows关于使用Xshell管理你的云主机
假设你PC它是linux系统.那么直接与终端ssh命令就可以了.假设Windows系统.使用它是必要的sshclient. PS:我双系统. 有时候,他们想使用Windows的. Windows上ss ...
- 控制台程序的参数解析类库 CommandLine
C#控制台程序的参数解析类库 CommandLine简单使用说明 前言 C#开发的控制台程序,默认接收string[] args参数.如果有多个参数需要输入时,可以按照顺序依次输入:但如果有些参数不是 ...
- 判断Webbrowser是否加载完成
var Form1: TForm1; glpDisp: IDispatch = nil; implementation {$R *.dfm} procedure TForm1.EmbeddedWB1D ...
- cct,web技术
基本信息 全国计算机等级考试二级教程——Web程序设计(2016年版)作 者:教育部考试中心 编出 版 社:高等教育出版社出版时间:20115-12-1 ISBN:9787040442991版 ...
- 设置Oracle用IP远程连接和客户端访问
要想将oracle设置为多用户可远程访问,须进行以下设置: 1.路径:D:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN\listener.o ...
- iOS高效开源类库
因为iOS SDK相对比较底层,所以开发者就得受累多做一些体力活.不过幸运的是,有很多第三方的类库可以用来简化很多不必要的工作.笔者整理了一下在本人学习过程中用到的一些比较有用Objective-C开 ...