【xsy1230】 树(tree) 点分治+线段树
题目大意:有一棵$n$个节点的树,点的标号为$1$到$n$。树中的边有边权。给你$m$个询问,每个询问包含三个参数$l,r,pos$,你要求出标号在$l$到$r$之间的所有点中,到节点$pos$距离最近的点离$pos$有多远。
数据范围:$n,m,l,r,pos≤10^5$,强制在线。
此题我强制在线两个变量打反了,$wa$了一发。
我们考虑点分治,对于节点x,我们在节点$x$上种一个线段树,保存以$x$为跟(点分治树树根)的子树内,每个节点距离x的距离。
对于一组查询,我们直接在点分治树上从下往上条,每跳到一个节点查询一次就可以了。
时间复杂度:$O(n\log^2\ n)$。
#include<bits/stdc++.h>
#define M 100005
#define INF 1e9
using namespace std; struct edge{int u,v,next;}e[M*]={}; int head[M]={},use=;
void add(int x,int y,int z){use++;e[use].u=y;e[use].v=z;e[use].next=head[x];head[x]=use;} int siz[M]={},vis[M]={},Minn=,minid=,n;
void dfssiz(int x,int fa){siz[x]=;for(int i=head[x];i;i=e[i].next) if(e[i].u!=fa&&vis[e[i].u]==) dfssiz(e[i].u,x),siz[x]+=siz[e[i].u];}
void dfsmin(int x,int fa,int fsiz){int maxn=fsiz-siz[x]; for(int i=head[x];i;i=e[i].next) if(e[i].u!=fa&&vis[e[i].u]==) dfsmin(e[i].u,x,fsiz),maxn=max(maxn,siz[e[i].u]);if(maxn<Minn) Minn=maxn,minid=x;}
int makeroot(int x){Minn=M; dfssiz(x,); dfsmin(x,,siz[x]); return minid;} int lc[M*]={},rc[M*]={},minn[M*]={},root[M]={},cnt=;
void updata(int &x,int l,int r,int k,int val){
if(!x) minn[x=++cnt]=INF; minn[x]=min(minn[x],val);
if(l==r) return; int mid=(l+r)>>;
(k<=mid)?updata(lc[x],l,mid,k,val):updata(rc[x],mid+,r,k,val);
}
int query(int x,int l,int r,int ll,int rr){
if(x==||(ll<=l&&r<=rr)) return minn[x];
int mid=(l+r)>>,res=INF;
if(ll<=mid) res=min(res,query(lc[x],l,mid,ll,rr));
if(mid<rr) res=min(res,query(rc[x],mid+,r,ll,rr));
return res;
}
void build(int x,int fa,int dis,int &Root){
updata(Root,,n,x,dis);
for(int i=head[x];i;i=e[i].next) if(e[i].u!=fa&&vis[e[i].u]==) build(e[i].u,x,dis+e[i].v,Root);
} int fa[M]={};
void solve(int x,int F){
x=makeroot(x); vis[x]=; fa[x]=F;
build(x,,,root[x]);
for(int i=head[x];i;i=e[i].next) if(vis[e[i].u]==) solve(e[i].u,x);
}
void ReadData(){
minn[]=INF;
scanf("%d",&n);
for(int i=;i<n;i++){
int x,y,z; scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
solve(,);
} int query(int l,int r,int pos){
int minn=INF;
for(int x=pos;x;x=fa[x]){
int disnow=query(root[x],,n,l,r);
int dispos=query(root[x],,n,pos,pos);
minn=min(minn,dispos+disnow);
}
return minn;
}
void Solve(){
int q,ans=; scanf("%d",&q);
while(q--){
int l,r,pos; scanf("%d%d%d",&l,&r,&pos); pos^=ans;
printf("%d\n",ans=query(l,r,pos));
}
} int main(){
ReadData();
Solve();
}
【xsy1230】 树(tree) 点分治+线段树的更多相关文章
- 2019ICPC上海网络赛 A Lightning Routing I 点分树(动态点分治)+线段树
题意 给一颗带边权的树,有两种操作 \(C~e_i~w_i\),将第\(e_i\)条边的边权改为\(w_i\). \(Q~v_i\),询问距\(v_i\)点最远的点的距离. 分析 官方题解做法:动态维 ...
- [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)
[APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...
- UVALive 7148 LRIP【树分治+线段树】
题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...
- poj 3237 Tree(树链剖分,线段树)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7268 Accepted: 1969 Description ...
- 【loj6145】「2017 山东三轮集训 Day7」Easy 动态点分治+线段树
题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le ...
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- 【BZOJ4372】烁烁的游戏 动态树分治+线段树
[BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...
- HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)
Jam's problem again Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- 【bzoj4372】烁烁的游戏 动态点分治+线段树
题目描述 给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:Q x:询问x的点权.M x d w:将树上与节点x距离不超过d的节点的点权均加上w. 输入 第一行两个正整数:n,m接下来的n-1 ...
随机推荐
- display:grid
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 2018.10.12 bzoj4712: 洪水(树链剖分)
传送门 树链剖分好题. 考虑分开维护重儿子和轻儿子的信息. 令f[i]f[i]f[i]表示iii为根子树的最优值,h[i]h[i]h[i]表示iii重儿子的最优值,g[i]g[i]g[i]表示iii所 ...
- asp.net Hessian 服务的注册
Hessian服务端实现了IHttpHandle, 默认情况下是在Web.Config中的handles接点中注册,这样当有 很多实现时比较麻烦 这个时候可以实现IHttpHandleFactory注 ...
- shell中$(( ))、$( )与${ }的区别
转载自:http://blog.sina.com.cn/s/blog_4da051a60102uwda.html 命令替换 在bash中,$( )与` `(反引号)都是用来作命令替换的. 命令替换与变 ...
- memCachedClient 客户端调用时注意的问题,坑
// 第三个参数为计算该消息在服务器存放位置用 memCachedClient.add("someKey", "someValue", 10*24*60*60* ...
- ubuntu16.4中开启vncserver进行远程桌面
使用x11vnc作为vncserver端 1 安装x11vnc $ sudo apt-get update $ sudo apt-get install x11vnc 2 生成密码 $ x11vnc ...
- /usr/include/boost/python/detail/wrap_python.hpp:50:23: fatal error: pyconfig.h: No such file or directory
https://stackoverflow.com/questions/39111930/usr-include-boost-python-detail-wrap-python-hpp5023-fat ...
- Watermelon -- codeforces
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93241#problem/A (654123) http://codeforces.co ...
- java Object解析
java Object是所有对象的根父类,所有对象都直接或间接集成自该类. java 的Object类也比较简单,有equals(Object).toString().finalize() java方 ...
- OpenGL中位图的操作(glReadPixels,glDrawPixels等)
OpenGL中位图的操作 OpenGL中位图的操作(glReadPixels,glDrawPixels和glCopyPixels应用举例). 1. BMP文件格式简单介绍 BMP文件是一种像素文件,它 ...