2019牛客国庆集训派对day2 C.Just h-index(主席树)
发布日期:2021-06-30 10:32:58
浏览次数:2
分类:技术文章
本文共 1196 字,大约阅读时间需要 3 分钟。
维护 n n n颗 [ 1 , i ] [1,i] [1,i]的权值线段树
然后对于每个询问 [ l , r ] [l,r] [l,r],可以利用主席树做差得到当前区间的值
又因为答案具有单调性,所以可以在树上二分得到解
#includeusing namespace std;#define mid (l+r>>1)const int inf = 1e9;const int maxn = 1e6+10;const int N = maxn*40;int n,m,q,a[maxn];int sum[N],ls[N],rs[N],id,rt[N];void update(int &root,int pre,int l,int r,int val){ root = ++id; ls[root] = ls[pre], rs[root] = rs[pre]; //sum[root] = sum[pre]; if( l==r ) { sum[root] = sum[pre]+1; return; } if( val<=mid ) update( ls[root],ls[pre],l,mid,val ); else update( rs[root],rs[pre],mid+1,r,val ); sum[root] = sum[ls[root]] + sum[rs[root]];}int ask(int &root,int pre,int l,int r,int val){ int x = sum[rs[root]] - sum[rs[pre]];//右子树的数量 if( l==r ) return l; if( val+x>=mid+1 ) return ask( rs[root],rs[pre],mid+1,r,val ); else return ask( ls[root],ls[pre],l,mid,val+x);}int main(){ while( cin >> n >> q ) { for(int i=1;i<=n;i++) cin >> a[i]; for(int i=1;i<=n;i++)//维护一颗[1,i]的线段树 update( rt[i],rt[i-1],0,inf,a[i] ); while( q-- ) { int l,r; scanf("%d%d",&l,&r); printf("%d\n",ask( rt[r],rt[l-1],0,inf,0 ) ); } for(int i=0;i<=id;i++) ls[i] = rs[i] = rt[i] = sum[i] = 0; id = 0; }}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/116501090 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月22日 20时25分31秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【NLP学习笔记】One-hot encoding:独热编码
2019-04-30
【工具使用】CSDN编辑器markdown字体、颜色与字号的设置
2019-04-30
【NLP学习笔记】词共现矩阵
2019-04-30
【NLP学习笔记】NLP基础知识框架图
2019-04-30
【深度学习笔记】卷积的输入输出的通道、维度或尺寸变化过程
2019-04-30
【NLP学习笔记】训练集、验证集和测试集的概念及划分
2019-04-30
【NLP学习笔记】conda换源
2019-04-30
【深度学习笔记】标准卷积
2019-04-30
【深度学习笔记】组卷积
2019-04-30
【深度学习笔记】循环神经网络和递归神经网络区别
2019-04-30
【学习笔记】英文科技论文常见英语句式积累
2019-04-30
【深度学习笔记】PixelShuffle
2019-04-30
【python3学习笔记】斜杠和双斜杠运算符的区别
2019-04-30
【深度学习笔记】用torch.nn.Sequential()搭建神经网络模型
2019-04-30
【深度学习笔记】用torch.nn.ModuleList搭建神经网络
2019-04-30