Submission #1264943

#TimeUsernameProblemLanguageResultExecution timeMemory
1264943minggaArt Collections (BOI22_art)C++20
0 / 100
0 ms408 KiB
// Author: caption_mingle
#include "bits/stdc++.h"
#include "art.h"

using namespace std;

#define ln "\n"
#define pb push_back
#define fi first
#define se second
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int)(x).size())
#define ll long long
const int mod = 1e9 + 7;
const int inf = 2e9;

struct BIT {
	int n;
	vector<int> bit;
	BIT(int n) : n(n) {
		bit.resize(n + 1, 0);
	}
	void update(int u, int x) {
		for(; u <= n; u += (u & -u)) bit[u] += x;
	}
	int get(int u) {
		int ans = 0;
		for(; u > 0; u -= (u & -u)) ans += bit[u];
		return ans;
	}
	int get(int l, int r) {
		return get(r) - get(l - 1);
	}
};

void solve(int N) {
	vector<int> vec;
	for(int i = 1; i <= N; i++) vec.pb(i);
	int base = publish(vec);
	vector<int> f(N + 1, 0);
	for(int i = 2; i <= N; i++) {
		vector<int> vec;
		vec.pb(i);
		for(int j = 1; j <= N; j++) {
			if(j == i) continue;
			vec.pb(j);
		}
		int cur = publish(vec);
		f[i] = (i - 1 + base - cur) / 2;
	}
	vector<int> ans;
	BIT bit(N);
	for(int i = 1; i <= N; i++) bit.update(i, 1);
	for(int i = N; i > 0; i--) {
		int l = 1, r = N, tar;
		while(l <= r) {
			int m = (l + r) >> 1;
			if(bit.get(m, N) >= f[i] + 1) {
				tar = m;
				l = m + 1;
			} else r = m - 1;
		}
		ans.pb(tar);
		bit.update(tar, -1);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...