求助
#3 WA
#include <bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch > '9' or ch < '0') {
if (ch == '-') {
f = -f;
}
ch = getchar();
}
while (ch >= '0' and ch <= '9') {
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
void write(int x) {
if (!x)
return;
write(x / 10);
putchar(x % 10 + '0');
}
struct node {
int val, id;
bool operator<(const node &a)const {
return val < a.val;
}
} a[N];
int T, n, k;
int b[N], c[N];
int lowbit(int x) {
return x & (-x);
}
void add(int p, int x) {
while (p <= n) {
b[p] += x;
p += lowbit(p);
}
}
int getsum(int p) {
int res = 0;
while (p) {
res += b[p];
p -= lowbit(p);
}
return res;
}
int getsum(int l, int r) {
return getsum(r) - getsum(l - 1);
}
bool check(int mid) {
memset(b, 0, sizeof(b));
int cnt = 1;
int sum = 0;
int l = 1;
for (int i = 1; i <= n; i++) {
int temp = getsum(c[i], n);
if (sum + temp > mid) {
cnt++;
sum = 0;
for (int j = l; j < i; ++ j) {
add(c[j], -1);
}
l = i;
} else
sum += temp;
add(c[i], 1);
}
if (cnt > k)
return 0;
else
return 1;
}
signed main() {
T = read();
while (T--) {
memset(b, 0, sizeof(b));
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
n = read();
k = read();
for (int i = 1; i <= n; i++) {
a[i].val = read();
a[i].id = i;
}
sort(a + 1, a + n + 1);
int cnt = 0;
a[0].val = 0x3f3f3f3f;
for (int i = 1; i <= n; i++) {
if (a[i].val != a[i - 1].val) cnt++;
c[a[i].id] = cnt;
}
int l = 0, r = n * n;
while (l < r) {
int mid = (l + r) / 2;
if (check(mid)) {
r = mid;
} else
l = mid + 1;
}
if (l != 0)
write(l);
else
putchar('0');
putchar('\n');
}
return 0;
}