[SP10628]Count on a tree
Description:
给定一颗n个点的树,有m个询问,求任意两点路径上点权第k小的点
Hint:
\(n,m<=1e5\)
Solution:
比较水
以每个点到根节点的数的前缀和建主席树
结合树上两点距离求法
每次的\(size=size[u]+size[v]-size[lca]-size[fa[lca]]\)
#include<bits/stdc++.h>
using namespace std;
const int mxn=6e5+5;
struct ed {
int to,nxt;
}t[mxn<<1];
int n,m,s,tot,ans,cnt,hd[mxn],f[mxn][19],ls[mxn<<3],rs[mxn<<3],sum[mxn<<3],a[mxn],b[mxn],rt[mxn],dep[mxn];
inline void add(int u,int v) {
t[++cnt]=(ed){v,hd[u]},hd[u]=cnt;
}
void update(int las,int& p,int l,int r,int val)
{
if(!p) p=++tot;
sum[p]=sum[las]+1;
if(l==r) return ;
int mid=(l+r)>>1;
if(val<=mid) update(ls[las],ls[p],l,mid,val),rs[p]=rs[las];
else update(rs[las],rs[p],mid+1,r,val),ls[p]=ls[las];
}
int query(int las1,int las2,int p1,int p2,int l,int r,int k)
{
if(l==r) return l;
int tp=sum[ls[p1]]+sum[ls[p2]]-sum[ls[las1]]-sum[ls[las2]];
int mid=(l+r)>>1;
if(k<=tp) query(ls[las1],ls[las2],ls[p1],ls[p2],l,mid,k);
else query(rs[las1],rs[las2],rs[p1],rs[p2],mid+1,r,k-tp);
}
void dfs(int u,int fa)
{
f[u][0]=fa; dep[u]=dep[fa]+1;
update(rt[fa],rt[u],1,s,b[u]);
for(int i=hd[u];i;i=t[i].nxt) {
int v=t[i].to;
if(v==fa) continue ;
dfs(v,u);
}
}
int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=18;i>=0;--i)
if(dep[f[x][i]]>=dep[y])
x=f[x][i];
if(x==y) return x;
for(int i=18;i>=0;--i)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][0];
}
void solve(int u,int v,int k)
{
u^=ans;
int lca=LCA(u,v);
ans=a[query(rt[lca],rt[f[lca][0]],rt[u],rt[v],1,s,k)];
printf("%d\n",ans);
}
int main()
{
scanf("%d%d",&n,&m); int u,v,k;
for(int i=1;i<=n;++i) scanf("%d",&a[i]),b[i]=a[i];
sort(a+1,a+n+1);
s=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=n;++i) b[i]=lower_bound(a+1,a+s+1,b[i])-a;
for(int i=1;i<n;++i) {
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
dfs(1,0);
for(int j=1;j<=18;++j)
for(int i=1;i<=n;++i)
f[i][j]=f[f[i][j-1]][j-1];
for(int i=1;i<=m;++i) {
scanf("%d%d%d",&u,&v,&k);
solve(u,v,k);
}
return 0;
}
[SP10628]Count on a tree的更多相关文章
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- SPOJ 10628 Count on a tree(Tarjan离线LCA+主席树求树上第K小)
COT - Count on a tree #tree You are given a tree with N nodes.The tree nodes are numbered from 1 to ...
- 【BZOJ-2588】Count on a tree 主席树 + 倍增
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 3749 Solved: 873[ ...
- 【BZOJ】【2588】COT(Count On a Tree)
可持久化线段树 maya……树么……转化成序列……所以就写了个树链剖分……然后每个点保存的是从它到根的可持久化线段树. 然后就像序列一样查询……注意是多个左端点和多个右端点,处理方法类似BZOJ 19 ...
- BZOJ 2588: Spoj 10628. Count on a tree 树上跑主席树
2588: Spoj 10628. Count on a tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/J ...
- spoj cot: Count on a tree 主席树
10628. Count on a tree Problem code: COT You are given a tree with N nodes.The tree nodes are number ...
- Bzoj 2588: Spoj 10628. Count on a tree 主席树,离散化,可持久,倍增LCA
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2588 2588: Spoj 10628. Count on a tree Time Limit ...
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...
- SPOJ Count on a tree
Count on a tree Time Limit:129MS Memory Limit:1572864KB 64bit IO Format:%lld & %llu Subm ...
随机推荐
- Navicat Premium 12.1.8.0安装与激活
本文介绍Navicat Premium 12.1.8.0的安装.激活与基本使用. 博主所提供的激活文件理论支持Navicat Premium 12.0.x系列和Navicat Premium 12.1 ...
- java基础应用循环的应用
1.1 [经典面试题]: &&(短路与)与&(非短路与)的区别: 表达式1 && 表达式2 表达式1如果为false,表达式2不执行,整个表达式结果为false ...
- k3 Bos开发百问百答
K/3 BOS开发百问百答 (版本:V1.1) K3产品市场部 目录 一.基础资料篇__ 1 [摘要]bos基础资料的显示问题_ 1 [摘要]单 ...
- Git基础(二) 文件的生命周期
使用Git时,文件的生命周期如下:
- javascript 中 x offsetX clientX screenX pageX的区别
在javascript的事件对象中的关于事件鼠标位置的几个属性(x, pageX, offsetX, scrrenX clientX)及(y, pageY, offsetY, screenY, cli ...
- [转] node升级到8.0.0在vscode启动js执行文件报错
由于升级node 到 8.0.0 版本 vscode 启动一直报错: `node --debug` and `node --debug-brk` are invalid. Please use `no ...
- angular 4 开发环境下打包文件过大
angular 4本地开发环境下,ng server -- port 8080 -o 之后在在浏览器中查看数据请求,其中vendor.bundle.js有8.3mb,而整个传输数据大小为16.3mb ...
- 标准C语言实现基于TCP/IP协议的文件传输
TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下: 1.Socket系统调用 为了进行网络I/O,服务器和客户机两 ...
- Centos7编译安装GCC7.2
通常编译的时候可能需要新版本的gcc,本文就说明下基于低版本的gcc升级为gcc7.2 wget 'http://mirrors-usa.go-parts.com/gcc/releases/gcc-7 ...
- react native初始化项目
打开命令行窗口,进入我们想要创建项目的父目录,输入命令: npm install -g yarn react-native-cli react-native init 项目名 进入新建的项目目录,执行 ...