Submission #1297689

#TimeUsernameProblemLanguageResultExecution timeMemory
1297689OgradLBoarding Passes (BOI22_passes)C++20
60 / 100
732 ms656 KiB
#include <functional>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;

void bucket_sort(int M, vector<int>& arr, function<int(int)> cmp){
	vector<vector<int>> buckets(M);

	for (int x : arr){
		buckets[cmp(x)].push_back(x);
	}

	int idx = 0;
	for (int i = 0; i < M; i++){
		for (int x : buckets[i]){
			arr[idx++] = x;
		}
	}
}

int main(){

	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	string S;
	cin >> S;

	int N = S.size();

	int G = 10;

	vector<int> masks(1 << G);
	iota(masks.begin(), masks.end(), 0);

	bucket_sort(G+1, masks, [](int mask){
		return __builtin_popcount(mask);
	});

	vector<long long> cost(1 << G, 1e18);
	cost[0] = 0;

	for (int mask : masks){
		for (int i = 0; i < G; i++){
			if (mask & (1 << i))
				continue;

			int cnt_i = 0, cnt_s = 0;
			for (int j = 0; j < N; j++){
				int g = S[j] - 'A';
				if (g == i)
					cnt_i++;
				if (mask & (1 << g))
					cnt_s++;
			}

			long long c = 0;

			int cnt_i_pre = 0, cnt_s_pre = 0;
			for (int j = 0; j < N; j++){
				int g = S[j] - 'A';

				if (g == i){
					cnt_i--;

					c += min(cnt_i_pre + 2*cnt_s_pre, cnt_i + 2*cnt_s);

					cnt_i_pre++;
				} else if (mask & (1 << g)){
					cnt_s_pre++;
					cnt_s--;
				}
			}

			cost[mask | (1 << i)] = min(cost[mask | (1 << i)], cost[mask] + c);
		}
	}

	long long ans = cost[(1 << G) - 1];
	cout << ans / 2 << ((ans & 1) ? ".5" : "") << "\n";
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...