题目链接:传送门

解题思路:这道题做法倒是挺多的,平方分割可以做,归并树,划分树,主席树都能做,但是本片博客主要讲解一下平方分割的做法(比较简单),我们把n个数分为n/1000个桶,然后我们维护每个桶即可,我们通过预处理把每个桶的元素进行排序处理,然后我们二分查找第k小的数字,在[l,r]这个区间比第第k小的数字肯定只有k-1个,比第k大的数字只有(r-l+1)-k个,我们会发现我们查询的区间无非就两种情况,第一种,就是查询区间完全被包含在区间内,第二种就是所在的桶不完全包含区间内的元素,需要我们逐步处理,时间复杂度为\(O(nlogn+m\sqrt{n}log^1.5n)\)
Code:
#include
#include
#include
#include
using namespace std;
const int B = 1000, N = 100005;
int n,m;
int a[N],b[N];
vector ton[N/B+1];
int main()
{
int t;
scanf("%d%d",&n,&m);
for(int i = 0;i < n; ++i) {
scanf("%d",&a[i]);
ton[i/B].push_back(a[i]);
b[i] = a[i];
}
sort(b,b+n);
for(int i = 0,len = n/B;i < len; ++i) {
sort(ton[i].begin(),ton[i].end());//对每一个桶进行预处理
}
int l,r,k;
while(m--) {
scanf("%d%d%d",&l,&r,&k);
l--;
int lb = -1, rb = n;
while(lb + 1 < rb) {//二分查找x
int mid = (lb + rb) >> 1;
int x = b[mid];
int tl = l,tr = r, c = 0;
while(tl < tr && tl % B != 0) if(a[tl++]
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录