数据过水
查看原帖
数据过水
974277
水星湖psgqwq楼主2024/3/18 13:02
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;

int n, k, b[100005];
int a[100005];

void add(int x,int y)
{
    while(x <= n)
    {
        b[x] += y;
        x += x & -x;
    }
}

int query(int x)
{
    int res = 0;
    while(x)
    {
        res += b[x];
        x -= x & -x;
    }
    return res;
}

bool check(int mid)
{
    int now = 0;
    int cnt = 1;
    vector<int> nums; 
    for(int i=1; i<=n; i++)
    {
        now += query(n) - query(a[i]);
        if(now > mid)
        {
            now = 0;
            for(auto i : nums) add(i, -1);
            nums.clear();
            cnt++;
        }
        nums.push_back(a[i]);
        add(a[i], 1);
    }
    for(auto i : nums) add(i,-1);
    return cnt <= k;
}
void solve()
{
    cin >> n >> k;
    vector<int> nums(n+5);
    for (int i = 1; i <= n; ++i) {
        cin>>a[i];
        nums.push_back(a[i]);
    }
    sort(nums.begin(), nums.end());
    nums.erase(unique(nums.begin(), nums.end()), nums.end());
    for (int i = 1; i <= n; ++i) {
        a[i] = (lower_bound(nums.begin(), nums.end(), a[i]) - nums.begin() + 1);
    }
    int l = 0, r = n * (n - 1) >> 1, ans;
    while(l <= r)
    {
        int mid = l + r >> 1;
        if(check(mid))
        {
            ans = mid;
            r = mid - 1;
        }
        else
            l = mid + 1;
    }
    cout << ans << endl;
}

signed main()
{
    int t;
    cin >> t;
    while(t--)
        solve();
    return 0;
}

样例没过 AC了

2024/3/18 13:02
加载中...