题目大意:有一棵$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) 点分治+线段树的更多相关文章

  1. 2019ICPC上海网络赛 A Lightning Routing I 点分树(动态点分治)+线段树

    题意 给一颗带边权的树,有两种操作 \(C~e_i~w_i\),将第\(e_i\)条边的边权改为\(w_i\). \(Q~v_i\),询问距\(v_i\)点最远的点的距离. 分析 官方题解做法:动态维 ...

  2. [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树)

    [APIO2019] [LOJ 3146] 路灯 (cdq分治或树状数组套线段树) 题面 略 分析 首先把一组询问(x,y)看成二维平面上的一个点,我们想办法用数据结构维护这个二维平面(注意根据题意这 ...

  3. UVALive 7148 LRIP【树分治+线段树】

    题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...

  4. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  5. 【loj6145】「2017 山东三轮集训 Day7」Easy 动态点分治+线段树

    题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le ...

  6. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  7. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

    [BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...

  8. 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 ...

  9. 【bzoj4372】烁烁的游戏 动态点分治+线段树

    题目描述 给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:Q x:询问x的点权.M x d w:将树上与节点x距离不超过d的节点的点权均加上w. 输入 第一行两个正整数:n,m接下来的n-1 ...

随机推荐

  1. .NET中的Func委托用法

    MSDN对于Func<T, TResult>)的官方解释: 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法. 下面通过几个例子对比下,就容易知道其用法: 以下例子演示了 ...

  2. 2018.09.28 牛客网contest/197/A因子(唯一分解定理)

    传送门 比赛的时候由于变量名打错了调了很久啊. 这道题显然是唯一分解定理的应用. 我们令P=a1p1∗a2p2∗...∗akpkP=a_1^{p_1}*a_2^{p_2}*...*a_k^{p_k}P ...

  3. 2018.07.17 后缀自动机模板(SAM)

    洛谷传送门 这是一道后缀自动机的模板题,这道题让我切身体会到了后缀自动机的方便与好写. 代码如下: #include<bits/stdc++.h> #define N 2000005 #d ...

  4. redis学习-事务命令

    multi:开启事务 exec:提交事务 discard:取消事务 1.开启事务之后,每次执行命令之后,都要先进入事务队列中,只有在执行 exec之后才开始执行 2.开启事务之后,每次执行命令之后,都 ...

  5. mybatis后台中传参到sql语句中,使用@Param注解

  6. HDU 4562 守护雅典娜 (计算几何+DP)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...

  7. UVa 1572 Self-Assembly (构造+拓扑排序。。。。。)

    题意:给定n个带标号的正方形,标号要么是一个大写字母加一个+或-,要么是00, 当且仅当大写字母相同并且符号相反时可以连接,问你给定的能不能拼成一个无限大的的东西. 析:说实话,真心没有看出来是拓扑排 ...

  8. Java Toolkit类用法

    这是一个AWT工具箱.它提供对本地GUI最低层次的JAVA访问.在大多情况下,这个类不直接用在小应用程序或应用程序中.具有把行图形数据转换为可显示的图像.返回字体信息.得出显示尺寸和分辨率以及获得系统 ...

  9. HDU1312 Red and Black(DFS) 2016-07-24 13:49 64人阅读 评论(0) 收藏

    Red and Black Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  10. LINUX中关于SIGNAL的定义

    /* Signals. */ #define SIGHUP 1 /* Hangup (POSIX). */ #define SIGINT 2 /* Interrupt (ANSI). */ #defi ...