TLE#5求助
查看原帖
TLE#5求助
632311
huyangmu楼主2024/8/27 20:28

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 1e5 + 5;
int t, n, k, a[N], b[N], tree[N], ans;
int lowbit (int x){
	return x & -x;
}
int query (int x){
	int sum = 0;
	while (x){
		sum += tree[x];
		x -= lowbit(x);
	}
	return sum;
}
void update (int x, int val){
	while (x <= n){
		tree[x] += val;
		x += lowbit(x);
	}
	return ;
}
bool check (int x){
	int sum = 0, tot = 1, last = 1;
	for (int i = 1; i <= n; ++i) b[i] = a[i];
	sort (b + 1, b + n + 1);
	int len = unique (b + 1, b + n + 1) - (b + 1);
	for (int i = 1; i <= n; ++i){
		int l = 1, r = len, pos;
		while (l <= r){
			int mid = l + r >> 1;
			if (b[mid] >= a[i]){
				pos = mid;
				r = mid - 1;
			}else l = mid + 1;
		}
		a[i] = pos;
	}
	update (a[1], 1);
	for (int i = 2; i <= n; ++i){
		sum += (query(n) - query(a[i]));
		if (sum > x){
			++tot;
			sum = 0;
			for (int j = last; j < i; ++j) update (a[j], -1);
			last = i;
		}
		update (a[i], 1);
	}
	for (int i = last; i <= n; ++i) update (a[i], -1);
	return tot <= k;
}
signed main (){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> t;
	while (t --){
		cin >> n >> k;
		for (int i = 1; i <= n; ++i) cin >> a[i];
		int l = 0, r = 1e18;
		ans = 0;
		while (l <= r){
			int mid = l + r >> 1;
			if (check(mid)){
				ans = mid;
				r = mid - 1;
			}else l = mid + 1;
		}
		cout << ans << '\n';
	}
	return 0;
}
2024/8/27 20:28
加载中...