Submission #1239283

#TimeUsernameProblemLanguageResultExecution timeMemory
1239283arvxsArranging Shoes (IOI19_shoes)C++20
0 / 100
1094 ms320 KiB
#include <bits/stdc++.h>

using namespace std;

struct BIT {
        int n;
        vector<int> t;
        BIT(int _n):n(_n),t(n+1,0){}
        void add(int i,int v){ for(;i<=n;i+=i&-i) t[i]+=v; }
        int sum(int i){ int r=0; for(;i>0;i-=i&-i) r+=t[i]; return r;}
};

long long count_swaps(vector<int> S) {

	// vector of occurences for each type
	int N = S.size();
	vector<pair<int, int> > occ[N / 2 + 1];

	for (int i = 0; i < N; i++) {
		occ[abs(S[i])].push_back({S[i], i});
	}

	long long ans = 0;

	vector<pair<int, int> > intervals;

	for (int x = 1; x <= N / 2; x++) {
		vector<pair<int, int> > &v = occ[x];

		int m = v.size() / 2;
		sort(v.begin(), v.end());

		for (int i = 0; i < m; i++) {
			int l = v[i].second;
			int r = v[i + m].second;

			if (l > r) {
				swap(l, r);
				ans++;
			}

			intervals.push_back({l + 1, r + 1});
		}
	}

	sort(intervals.begin(), intervals.end());

	BIT bit(N);
	for (int i = 1; i <= N; i++) 
		bit.add(i, 1);	

	for (int i = 1; i <= N; i++) {
		int l = intervals[i].first;
		int r = intervals[i].second;
		bit.add(i, 1);
		ans += bit.sum(r - 1) - bit.sum(l);
		bit.add(l, -1);
        bit.add(r, -1);
	}


	return ans;

}
#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...