牛客 6. 区间第k小(一)
原题链接
简单
作者:
高木さん
,
2024-09-11 00:48:14
,
所有人可见
,
阅读 11
树状数组+二分
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n , l , k;
int tr[N] , a[N];
int lowbit(int x)
{
return x & -x;
}
void add(int x , int v)
{
for(int i = x ; i <= N ; i += lowbit(i)) tr[i] += v;
}
int sum(int x)
{
int res = 0;
for(int i = x ; i ; i -= lowbit(i)) res += tr[i];
return res;
}
int main(){
cin >> n >> l >> k;
for(int i = 1 ; i <= n ; i ++)
cin >> a[i];
for(int i = 1 ; i <= n ; i ++)
{
add(a[i] , 1);
if(i >= l){
int L = 0 , R = 1e5;
while(L < R)
{
int mid = L + R >> 1;
// cerr << L << ' ' << R << '\n';
// cout << sum(mid) << '\n';
if(sum(mid) >= k) R = mid;
else L = mid + 1;
}
cout << R << ' ';
add(a[i - l + 1] , -1);
}
}
}
主席树(可持久化线段树)