树状数组WA 30pts求调
查看原帖
树状数组WA 30pts求调
1014614
SWAP__楼主2024/8/30 20:44
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
const int p = 1e9 + 7;
int n, k;
int a[N], s[N];
bool fl[N],f1[N];
int ans[N];//ans[i]表示出现次数大于等于i的数字个数
int lowbit(int x){
	return x & -x;
}
void update(int x, int d){
	while(x <= n){
		ans[x] += d;
		x += lowbit(x);
	}
}
int sum(int x){
	int s = 0;
	while(x >= 1){
		s += ans[x];
		x -= lowbit(x);
	}
	return s;
}
signed main(){
	cin >> n >> k;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
	}
	int l = 1, r = 1, x = 0;
	int minn = n;
	s[a[l]]++;
	update(s[a[1]], 1);
	while(r <= n){
	//	cout << l << " " << r << " " << x << endl;
		if(x >= k && l < r){
			minn = min(minn, r - l + 1);
			x -= sum(n) - sum(s[a[l]] - 1) - 1;
			update(s[a[l]], -1);
			s[a[l]]--;
			if(s[a[l]] > 0)update(s[a[l]], 1);
			l++;
		}else{
			if(r == n)break;
			r++;
			if(s[a[r]] > 0)update(s[a[r]], -1);
			s[a[r]]++;
			update(s[a[r]], 1);
			x += sum(n) - sum(s[a[r]] - 1) - 1;
		}
	}
	if(l == 1 && r == n && x < k){
		cout << -1;
	}else{
		cout << minn;
	}
}
2024/8/30 20:44
加载中...