bzoj 2588 树上主席树
主席树上树,对于每个节点,继承其父亲的,最后跑f[x]+f[y]-f[lca]-f[fa[lca]]
去重竟然要减一,我竟然不知道??
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#define N 100005
using namespace std;
int e=1,head[N];
struct edge{
int u,v,next;
}ed[2*N];
void add(int u,int v){
ed[e].u=u;ed[e].v=v;
ed[e].next=head[u];
head[u]=e++;
} int root[2*N],sum[80*N],lon[80*N],ron[80*N],sz;
int dep[2*N],fa[2*N][18],n,m,v[2*N],num[2*N],num_cnt; void print(int rt,int l,int r){
if(!rt) return;
printf("%d %d %d %d %d %d\n",rt,l,r,lon[rt],ron[rt],sum[rt]);
int mid=(l+r)>>1;
print(lon[rt],l,mid);
print(ron[rt],mid+1,r);
}
void update(int p,int &rt,int l,int r,int x){
rt=++sz;
sum[rt]=sum[p]+1;
if(l==r) return;
lon[rt]=lon[p]; ron[rt]=ron[p];
int mid=(l+r)>>1;
if(x<=mid) update(lon[p],lon[rt],l,mid,x);
else update(ron[p],ron[rt],mid+1,r,x);
} void dfs(int x){
for(int i=1;i<=17;i++)
if((1<<i)<=dep[x])
fa[x][i]=fa[fa[x][i-1]][i-1];
else break;
update(root[fa[x][0]],root[x],1,num_cnt,v[x]);
for(int i=head[x];i;i=ed[i].next){
int v=ed[i].v;
if(v==fa[x][0]) continue;
dep[v]=dep[x]+1; fa[v][0]=x;
dfs(v);
}
}
int lca(int x,int y){
if(dep[x]<dep[y])swap(x,y);
int t=dep[x]-dep[y];
for(int i=17;~i;i--)
if(t&(1<<i))
x=fa[x][i];
if(x==y)return x;
for(int i=17;~i;i--)
if(fa[x][i]!=fa[y][i])
x=fa[x][i],y=fa[y][i];
return fa[x][0];
} int query(int x,int y,int k){
int ca=lca(x,y);
int a=root[x],b=root[y],c=root[ca],d=root[fa[ca][0]];
int l=1,r=num_cnt;
while(l<r){
int mid=(l+r)/2;
int tmp=sum[lon[a]]+sum[lon[b]]-sum[lon[c]]-sum[lon[d]];
if(tmp>=k){r=mid;a=lon[a];b=lon[b];c=lon[c];d=lon[d];/*printf("666\n");*/}
else{k-=tmp;l=mid+1;a=ron[a];b=ron[b];c=ron[c];d=ron[d];}
}
//printf("l==%d\n",l);
return num[l];
}
int main()
{
int U,V,kth;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&v[i]);
num[i]=v[i];
}
sort(num+1,num+n+1);
num_cnt=unique(num+1,num+n+1)-num-1;
for(int i=1;i<=n;i++)
v[i]=lower_bound(num+1,num+num_cnt+1,v[i])-num;
for(int i=1;i<n;i++){
scanf("%d%d",&U,&V);
add(U,V); add(V,U);
}
dep[0]=-1;
dfs(1);
int ans=0;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&U,&V,&kth);
U^=ans;
ans=query(U,V,kth);
printf("%d",ans);
if(i<m) printf("\n");
}
return 0;
}
bzoj 2588 树上主席树的更多相关文章
- SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解
题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点 ...
- p3302 [SDOI2013]森林(树上主席树+启发式合并)
对着题目yy了一天加上看了一中午题解,终于搞明白了我太弱了 连边就是合并线段树,把小的集合合并到大的上,可以保证规模至少增加一半,复杂度可以是\(O(logn)\) 合并的时候暴力dfs修改倍增数组和 ...
- 【洛谷2633】Count on a tree(树上主席树)
点此看题面 大致题意: 给你一棵树,每次问你两点之间第\(k\)小的点权,强制在线. 主席树 这种题目强制在线一般就是数据结构了. 而看到区间第\(k\)小,很容易就能想到主席树. 至少不会有人想到树 ...
- Count on a tree 树上主席树
Count on a tree 树上主席树 给\(n\)个树,每个点有点权,每次询问\(u,v\)路径上第\(k\)小点权,强制在线 求解区间静态第\(k\)小即用主席树. 树上主席树类似于区间上主席 ...
- [CSP-S模拟测试]:e(树上主席树)
题目传送门(内部题66) 输入格式 第一行,一个正整数$n$,一个自然数$q$,一个整数$type$.第二行,$n$个正整数,代表$a_i$.接下来$n-1$行,每行两个正整数$u$.$v$,代表树中 ...
- bzoj3123 [Sdoi2013]森林 树上主席树+启发式合并
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3123 题解 如果是静态的查询操作,那么就是直接树上主席树的板子. 但是我们现在有了一个连接两棵 ...
- 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 COT 树上主席树
这是学完主席树去写的第二道题_(:з」∠)_ 之前用树上莫队水过了COT2... 其实COT也可以用树上莫队水过去不过好像复杂度要带个log还是怎么样可能会被卡常数.. 那就orz主席吧.... 写了 ...
- ☆ [洛谷P2633] Count on a tree 「树上主席树」
题目类型:主席树+\(LCA\) 传送门:>Here< 题意:给出一棵树.每个节点有点权.问某一条路径上排名第\(K\)小的点权是多少 解题思路 类似区间第\(K\)小,但放在了树上. 考 ...
随机推荐
- iOS 字体权重weight
UIFontWeightUltraLight - 超细字体 UIFontWeightThin - 纤细字体 UIFontWeightLight - 亮字体 UIFontWeightRegular ...
- 使用Puppeteer抓取受限网站
不要相信前端是安全的,今天简单验证一下,但是希望大家支持正版,支持原作者,毕竟写书不易. 安装Puppteer npm install --save puppeteer 选择目标网站 我们这里选择胡子 ...
- Python的lambda
if else 可以用简单的三元运算符表示 if 1 == 1: name = 'wupeiqi' else: name = 'alex' --> name = 'wupeiqi' if 1 = ...
- Linux的chkconfig命令详解
chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--a ...
- TopShelf安装多实例
Topshelf 安装多实例命令: .\ConsoleApp1.exe -instance "newinstallname" install 多实例有一个好处就是容灾,当一个服务部 ...
- [ SSH框架 ] Hibernate框架学习之四(JPA)
一.JPA概述以及它和Hibernate之间的关系 1.1.Hibernate 概述 JPA Java Persistence API,是EJB3规范中负责对象持久化的应用程序编程接口(ORM接口), ...
- 深度学习之 TensorFlow(二):TensorFlow 基础知识
1.TensorFlow 系统架构: 分为设备层和网络层.数据操作层.图计算层.API 层.应用层.其中设备层和网络层.数据操作层.图计算层是 TensorFlow 的核心层. 2.TensorFlo ...
- Django1.10 release notes摘编
一.重点新特性: 1.面向PostgreSQL的全文搜索支持 2.新式风格的middleware 3.用户名Unicode编码的官方支持 二.一些可以提的改变: 1.用户名最大长度增加到150 2.不 ...
- Key-Value Store Indexer(Lily HBase Indexer) 小型采坑
环境: Cloudera Express 5.12.1 JDK 1.8.0_92 CentOS 7 步骤1:数据导入到Hbase中(非正题,跳过) hbase中表为allDoc,两个Family:fu ...
- oracle 登录数据库时报 无监听 的一种解决方式(监听日志文件达到4g默认上限)
问题:登录服务器时 报无监听服务 检查步骤: 1.进入sqlplus查看数据库的状态,显示当前数据库的状态为OPEN 脚本:select status from v$Instance; 2.检查数据库 ...