为什么#2就tle了
查看原帖
为什么#2就tle了
1048327
KANO07楼主2024/3/14 09:49

感觉写的挺对的(

#include<bits/stdc++.h>
#define endl '\n'	
using namespace std;
typedef long long ll;
ll a[100005];
ll b[100005];
ll bit[100005];
ll n,k;
ll get(ll val){
	return *lower_bound(b + 1, b + 1 + n, val);
}

ll lowbit(ll x){
	return x & (-x);
}
void add(ll x, ll k){
	for(ll i = x; i <= n; i += lowbit(i)) bit[i] += k;
}
ll query(ll x){
	ll ans = 0;
	for(ll i = x; i; i -= lowbit(i)) ans += bit[i];
	return ans;
}

ll q[100005];//存一下下修改过的点 
ll cnt = 0;
void init(){
	while(cnt){
		ll cur = q[cnt];
		cnt--;
		add(cur, -1);
	}
}
bool check(ll m){
	ll l = 1, r = 1;
	ll sum = 0, num = 1;
	while(r <= n){
		ll index = get(a[r]);
		add(index, 1);
		q[++cnt] = index;
		ll cur = (r - l + 1) - query(index);
		if(sum + cur > m){
			num++;
			if(num > k) break;
			sum = 0;
			l = r;
			init();
		}else{
			sum += cur;
			r++;
		}
	}
	init();
	if(num <= k) return 1;
	else return 0;	
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	ll T;
	cin>>T;
	while(T--){
		cin>>n>>k;
		for(ll i = 1; i <= n; i++){
			cin>>a[i];
			b[i] = a[i];
		}
		sort(b + 1, b + 1 + n);
		ll l = 0, r = 1ll*n*(n-1)/2;
		while(l <= r){
			ll mid = l + (r-l)/2;
			if(check(mid)){
				r = mid - 1;
			}else{
				l = mid + 1;
			}
		}
		cout<<l<<endl;
	}
	return 0;
}
2024/3/14 09:49
加载中...