BZOJ 10628 Luogu2633——count on a tree

题意:查询一定区间内第K小的点权。

由于有lastans所以强制在线,这道题就相当于树上的主席树,

树链剖分+主席树,主席树相比普通主席树有一丢丢的改变,

root[i]不再是指向root[i-1],而是指向它在树上的父亲,

维护的序列是它到根节点的这条路径。

所以在求区间第k小时,可以用前缀和的思想加上lca,

val[u]+val[v]-val[lca]-val[fa[lca]],

得出的是lca分别到u和v的这两条路径中每个节点的数出现的次数。

然后用二分思想,跟普通主席树一样,二分直至l==r。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int size[100005]={0},fa[100005]={0},son[100005]={0},top[100005],dep[100005]={0},ls[100005*20],rs[100005*20],val[100005*20],root[100005],sz,v[100005],
head[100005*2]={0},t=0,a[100002]={0},tot=0,real[100005]={0},dfn[100005]={0},num,cnt=0,pai[100005];
struct hh
{int  u,v,next;
}e[200005];
void add(int x,int  y)
{t++;e[t].u=x;e[t].v=y;e[t].next=head[x];head[x]=t;
}
void dfs(int now,int anc)
{int i;top[now]=anc;tot++;dfn[now]=tot;real[tot]=now;if(son[now]==-1) return;dfs(son[now],anc);for(i=head[now];i!=0;i=e[i].next){int v=e[i].v;if(v!=fa[now]&&v!=son[now])dfs(v,v);}
}
void build(int u)
{size[u]=1;for(int i=head[u];i!=0;i=e[i].next){int v=e[i].v;if(v!=fa[u]){dep[v]=dep[u]+1;fa[v]=u;build(v);size[u]=size[u]+size[v];if(son[u]==-1||size[v]>size[son[u]])son[u]=v;}}
}
int getlca(int x,int y)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]){swap(x,y);}x=fa[top[x]];}if(dep[x]<dep[y]){swap(x,y);}return y;
}
void insert(int &p,int cmp,int x,int l,int r){p=++cnt;ls[p]=ls[cmp];rs[p]=rs[cmp];val[p]=val[cmp]+1;if(l!=r){int mid=(l+r)/2;if(x<=mid){insert(ls[p],ls[cmp],x,l,mid);}else{insert(rs[p],rs[cmp],x,mid+1,r);}}
}
int query(int l,int r,int k){int a=l,b=r,c=getlca(a,b),d=fa[c],mid,all;a=root[dfn[a]];b=root[dfn[b]];c=root[dfn[c]];d=root[dfn[d]];l=1,r=sz;while(l<r){mid=(l+r)>>1;all=val[ls[a]]+val[ls[b]]-val[ls[c]]-val[ls[d]];if(all>=k){r=mid;a=ls[a];b=ls[b];c=ls[c];d=ls[d];}else{l=mid+1;a=rs[a];b=rs[b];c=rs[c];d=rs[d];k-=all;}}return v[l];
}
void jian(int &p,int l,int r){p=++cnt;if(l!=r){int mid=(l+r)/2;jian(ls[p],l,mid);jian(rs[p],mid+1,r);}
}
int main()
{
int c,b,k,p,i,x,y,s,z,lastans=0;scanf("%d%d",&num,&p);for(i=0;i<=num*4;i++)son[i]=-1;for(i=1;i<=num;i++){scanf("%d",&a[i]);}for(i=1;i<=num-1;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);}dep[1]=1;build(1);dfs(1,1);for(i=1;i<=num;i++){v[i]=pai[i]=a[i];}sort(v+1,v+num+1);sz=unique(v+1,v+num+1)-v-1;jian(root[0],1,sz);for(i=1;i<=num;i++){pai[i] = lower_bound(v + 1, v + 1 + sz, a[i]) - v;}for(i=1;i<=num;i++){int t=real[i];insert(root[i],root[dfn[fa[t]]],pai[t],1,sz);}while(p--){scanf("%d%d%d",&c,&b,&k);c=c^lastans;lastans=query(c,b,k);printf("%d\n",lastans);}return 0;
}

BZOJ 10628 Luogu 2633

转载于:https://www.cnblogs.com/Fish-/p/8253440.html

BZOJ 10628 Luogu 2633相关推荐

  1. UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)

    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组.ST表) 连NOI Day1T1都不会做...看了题解都写不出来还要抄Claris的代码.. 题 ...

  2. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)

    UOJ #131 BZOJ 4199 luogu P2178[NOI2015]品酒大会 (后缀自动机.树形DP) 水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.or ...

  3. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay) 手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.ne ...

  4. BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)

    BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演) 手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/ ...

  5. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)

    POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...

  6. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)

    BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块) 手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csd ...

  7. BZOJ 2152 Luogu 2634——聪聪可可

    BZOJ 2152  Luogu 2634--聪聪可可 题意 求两点之间路径和为3的倍数占的概率(最简) 解题思路与BZOJ1468差不多, 不过本题在计算经过某个点的次数时用了个ans数组, 对路径 ...

  8. Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)

    题目链接 (BZOJ) 大人,时代变了 (Gym) https://codeforces.com/gym/101190 (Luogu) https://www.luogu.com.cn/problem ...

  9. BZOJ 4814 Luogu P3699 [CQOI2017]小Q的草稿 (计算几何、扫描线、set)

    题目链接 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id=4814 (Luogu) https://www.luogu.org/problem/P ...

  10. BZOJ 4823 Luogu P3756 [CQOI2017]老C的方块 (网络流、最小割)

    题目链接 (Luogu) https://www.luogu.org/problem/P3756 (BZOJ) http://lydsy.com/JudgeOnline/problem.php?id= ...

最新文章

  1. python爬取哔哩哔哩视频_荐爬取哔哩哔哩中的cosplay小视频
  2. 解散了地图接口讨论群
  3. 搭建无人值守安装服务器(CentOS)
  4. jmeter之ip欺骗
  5. CSS选择器的权重与优先规
  6. c语言n次方怎么输入_C语言实现斐波拉契数列
  7. Docker 容器操作
  8. 开源编解码项目FFmpeg迎来20周年生日 凭一己之力养活全球无数播放器!
  9. matlab 灰度图像矩阵,MatLab矩阵运算——图像灰度化
  10. 单片机原理及应用c语言版课后答案魏鸿磊,单片机原理及应用
  11. 魏俊妮《非人力资源的人力资源管理技术提升》课程大纲
  12. 华为P9移动定制版刷为联通移动双4G版本
  13. 怎么把pdf文件转换成word免费转换器
  14. 腾讯组织了一个联盟,但无法阻止字节跳动拿走一半游戏广告
  15. 使用循环神经网络(RNN)实现影评情感分类
  16. 【SAP ABAP学习资料】SQL查询分析器——程序代码
  17. 解决 Unexpected token u in JSON at position 0
  18. HTML制作注册页面
  19. 调用百度h5活体检测,参数video_base64,视频解析错误的问题
  20. Ymir安装问题汇总

热门文章

  1. dubbo服务压力测试
  2. python法则_python复数及计算法则
  3. python 调用 c 生成数组_使用C类型如何将数组从C++函数返回到Python
  4. 如何计算给定一个unigram语言模型_数位语音处理Lesson3-初识前端信号处理、语言模型...
  5. ios 企业签名证书购买_iOS苹果企业签名须知
  6. docker 镜像注册【图文教程】
  7. windows安装node.js和cnpm
  8. php为什么发送不到sql,PHP-为什么我的Ajax无法执行我的SQL查询?
  9. mysql离线安装 window_5分钟完成mysql离线安装
  10. 【Python实例第15讲】分类概率图