Why WA #3
查看原帖
Why WA #3
743373
Vitamin_B楼主2024/7/12 14:57

rt,WhyWA#3

//# pragma GCC optimize("Ofast,no-stack-protector")
//
//# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

# include <bits/stdc++.h>

# define I return

# define AK 0

# define IOI ;

using namespace std;

typedef long long ll;

typedef pair <int, int> pii;

int t, n, m, k, a[100005], b[100005], tr[100005];

ll l, r, mid, best;

map <int, int> mp;

void add (int x) {

	while (x)
		++ tr[x], x ^= x & -x;

	return ;

}

void del (int x) {

	while (x)
		-- tr[x], x ^= x & -x;

	return ;

}

int find (int x) {

	int sum = 0;

	while (x <= m)
		sum += tr[x], x += x & -x;

	return sum;

}

bool check () {

	int tot = 0, x, lst = 1;

	ll now = 0;

	for (int i = 1; i <= n; ++ i) {

		x = find (a[i] + 1);
//		cerr << lst << '~' << i << ':';
		if (now + x > mid) {
//			cerr << "1 ";
			for (int j = lst; j < i; ++ j)
				del (a[j]);
//			cerr << "2 ";
			++ tot;

			now = 0;

			lst = i;

			add (a[i]);
//			cerr << "3 ";
		} else
			add (a[i]), now += x;
//		cerr << "4\n";
//		cerr << lst << '~' << i << ':' << tot << '\n';
	}

	for (int i = lst; i <= n; ++ i)
		del (a[i]);

	return ++ tot <= k;

}

int 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], b[i] = a[i];

		mp.clear ();

		sort (b + 1, b + n + 1), m = unique (b + 1, b + n + 1) - b;

		for (int i = 1; i <= m; ++ i)
			mp[b[i]] = i;

		for (int i = 1; i <= n; ++ i)
			a[i] = mp[a[i]];
//		for (int i = 1; i <= n; ++ i) cerr << a[i] << ' ';
		l = 0, r = n * (n - 1ll) / 2;

		while (l <= r) {

			mid = l + r >> 1;
//			cerr << l << '~' << r << ':' << mid << '\n';
			if (check ())
				r = mid - 1, best = mid;
			else
				l = mid + 1;

		}

		cout << best << '\n';

	}

	I AK IOI

}
/*
1
5 2
1 3 2 5 4
*/
2024/7/12 14:57
加载中...