题意:
给定一个包含 N 个结点的树. 树节点从 1 到 N编号.。每个节点有一个整数权值。

我们会要求您执行以下操作:
u v k : 询问从节点 u 到 节点 v 的路径上的第k小的权值
输入
在第一行中有两个整数N 和 M(N, M <= 100000)
在第二行中有N 个整数, 第i个整数表示第i个节点的权值。
接下来的N-1 行, 每行包含两个整数 u v, 它表示有一条边 (u, v).
在接下来的 M 行中, 每行有三个整数 u v k, 代表查询从节点 u 到节点 v的路径上权值第k小的节点的权值。

输出
对于每个操作,输出其结果。

题解:
如果你会LCA+可持久化线段树的话,那么这题就是个sb题。
但是更sb的操作要提前说一下
1.权值可能有负数(差点调的我怀疑人生
2.n最大好像是111111
3.大家都说不要用vector会被卡常,但是愣头青硬是用vector过了(还挺快

这题其实就是主席树放到了树上进行操作。并不是很花里胡哨得操作。
对于在树上得某条路径操作第k小,我们可以从根结点开始建主席树,每个结点的前一个结点就是他的父亲结点。这样我们可以把他放到树剖dfs遍历的过程中去。
然后对于每一次查询x,yx,yx,y,我们查询的时 x到LCA(x,y)x到LCA(x,y)x到LCA(x,y) 和y到LCA(x,y)y到LCA(x,y)y到LCA(x,y)这条路径上的第kkk小。
我们可以借鉴树差分的操作。
即为x+y−lca(x,y)−fa[lca(x,y)]。x+y-lca(x,y)-fa[lca(x,y)]。x+y−lca(x,y)−fa[lca(x,y)]。
所以说针对于query时我们要传入四个位置计算前缀状态即可。

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int maxn=2e5+10;int n,m;
vector<int> edge[maxn];
int dep[maxn],fa[maxn],sz[maxn],son[maxn];
int a[maxn],rt[maxn];
int lc[maxn*32],rc[maxn*32],sum[maxn*32];
int nums;
void update(int &node,int start,int ends,int lst,int pos){node=++nums;lc[node]=lc[lst];rc[node]=rc[lst];sum[node]=sum[lst]+1;if(start==ends) return ;int mid=(start+ends)/2;if(pos<=mid) update(lc[node],start,mid,lc[lst],pos);else update(rc[node],mid+1,ends,rc[lst],pos);
}
int query(int start,int ends,int x,int y,int z,int w,int k){if(start==ends){return start;}int mid=(start+ends)/2;int cha=sum[lc[y]]+sum[lc[x]]-sum[lc[z]]-sum[lc[w]];if(cha>=k) return query(start,mid,lc[x],lc[y],lc[z],lc[w],k);else return query(mid+1,ends,rc[x],rc[y],rc[z],rc[w],k-cha);
}void dfs1(int x,int f){fa[x]=f;dep[x]=dep[f]+1;sz[x]=1;int maxsize=-1;for(auto i:edge[x]){if(i==f) continue;dfs1(i,x);sz[x]+=sz[i];if(sz[i]>maxsize){maxsize=sz[i];son[x]=i;}}
}
int cnt,top[maxn];
int imax=0;
void dfs2(int x,int t){//dfn[x]=++cnt;top[x]=t;update(rt[x],1,imax,rt[fa[x]],a[x]);if(!son[x]) return ;dfs2(son[x],t);for(auto i:edge[x]){if(i==fa[x]||i==son[x]) continue;dfs2(i,i);}
}int LCA(int x,int y){while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);x=fa[top[x]];}return dep[x]<dep[y]?x:y;
}int getans(int x,int y,int k){int lca=LCA(x,y);//cout<<"debug  "<<lca<<endl;return query(1,imax,rt[x],rt[y],rt[lca],rt[fa[lca]],k);
}signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];a[i]+=2000000000;imax=max(imax,a[i]);}for(int i=0;i<n-1;i++){int x,y;cin>>x>>y;edge[x].push_back(y);edge[y].push_back(x);}int ans=0;dfs1(1,0);dfs2(1,1);//cout<<imax<<endl;while(m--){int x,y,k;cin>>x>>y>>k;//x^=ans;//cout<<x<<" "<<y<<endl;//cout<<"LCA:  "<<LCA(x,y)<<endl;ans=getans(x,y,k);cout<<ans-2000000000<<endl;}return 0;
}

SP10628 COT - Count on a tree (树剖+可持久化线段树)相关推荐

  1. BZOJ 3221: [Codechef FEB13] Obserbing the tree树上询问( 可持久化线段树 + 树链剖分 )

    树链剖分+可持久化线段树....这个一眼可以看出来, 因为可持久化所以写了标记永久化(否则就是区间修改的线段树的持久化..不会), 结果就写挂了, T得飞起...和管理员拿数据调后才发现= = 做法: ...

  2. 【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

    我似乎很少写这种算法博客 可持久化线段树概念 概念介绍(类比帮助理解) 简单分析一下时间和空间复杂度(内容池) 模板 结构体变量 建树模板 单点修改模板 单点查询模板 区间修改模板(pushup) 区 ...

  3. 算法学习:主席树(可持久化线段树)

    [前置知识]  线段树 [定义] [可持久化]能够保存历史版本,方便操作区间等,减少复杂度 [主席树] 可解决的经典问题区间第k大/小 时空复杂度为O(nlogn) [模板题] [luogu 3834 ...

  4. 可持久化线段树——主席树

    前言: 最近心(po)血(yu)来(ya)潮(li)学习了一下主席树.(再不学就落伍了) 主席树,即可持久化线段树,支持维护和查询区间的第\(k\)大(小).区间不同种类个数等,基于线段树的思想之上 ...

  5. BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector

    题目描述 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱.这样的 想法当然非常好啦,但是她们也发现她们面临着一个 ...

  6. jzoj 5850.【NOIP提高组模拟2018.8.25】e 可持久化线段树+lca

    Description Input Output Data Constraint 分析: 最小连通块可以看作是所有点到他们的 lca l c a lca路径的并集,因为是取最小值,所以重复的不会有贡献 ...

  7. SPOJ - COT Count on a tree [LCA+主席树]【数据结构】

    题目链接:http://www.spoj.com/problems/COT/en/ -------------------------------------- COT - Count on a tr ...

  8. SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)

    题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...

  9. AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

    文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...

最新文章

  1. Linux上oracle的安装
  2. 人生大道无形-----像水一样做人!!!
  3. WebForm实现增删改查
  4. LeetCode——Longest Substring Without Repeating Characters
  5. ncat 重复发送同一个文件
  6. python中操作数据库中游标的使用方法
  7. 【日本語学習】 刺身
  8. Python爬虫开发
  9. 使用halcon结合机械XY轴对相机进行9点标定
  10. ContentProvider和Uri详解
  11. [Luogu 1730]最小密度路径
  12. C++卡常数之内存优化
  13. 机房教学管理系统/机房管理系统
  14. BIM模型文件下载——四层仿古别墅模型
  15. MyBatis实现级联查询及逆向生成
  16. h3c无线管理 dns服务器,H3C FIT AP与AC连接时三种的注册流程
  17. 传奇SF刷元宝之迷失版本刷叠加材料
  18. 免费范文网复制内容-百味书屋
  19. Qt QTableWidget的使用方式
  20. 移动端基于Vant组件封装底部弹出搜索多选列表

热门文章

  1. ATM高层定义了4类业务,压缩视频信号的传送属于______。B
  2. 下载、安装、配置 java jdk1.8
  3. 构建一个运行在Azure虚拟机上的MySQL Spring Boot应用程序
  4. [BZOJ1503]郁闷的出纳员(Splay)
  5. Delphi中的消息截获
  6. Windows下MemCache多端口安装配置
  7. Linq之延迟加载特性
  8. [Z]应试生涯结束后,美国亚裔的那群超优生都过得如何?来源: 李璐瑶的日志...
  9. 在内核中增加对yaffs文件系统的支持
  10. linux统计文件的个数