P2073 题解
zhangbo1000 · · 题解
update 2024.3.21 重新提交以去除旧博客分类。
看了一圈题解居然没有伟大的树状数组的,那么我来写一个。
基础的树状数组操作不再赘述,建议去看模板题题解,这里主要讲下怎么用树状数组水平衡树。
(题目不强制在线,可以离散化,下面我默认值域大小与操作数同阶。)
首先我们假设
下面是重头戏,也是很多题解图片炸了没讲清楚的地方——查询排名为某值的数。
首先
想一想,为什么二分需要
仔细想一下,一个数
#define N 1000000
int c[N+1];
int findrank(const int& k){
static const int MAX=log2(N)+1;
static int ans,cnt,i;
for(i=MAX,ans=cnt=0;i>=0;i--){
ans+=1<<i;
if(ans>N||c[ans]+cnt>=k)ans-=1<<i;
else cnt+=c[ans];
}
return ans+1;
}
是不是比二分还短。
回到这个题上,操作
题的完整代码就不贴了,一点注释没加码风还不好。(想要看的跳转这里。)
广告。