Submission #1219783

#TimeUsernameProblemLanguageResultExecution timeMemory
1219783nikdArranging Shoes (IOI19_shoes)C++20
100 / 100
303 ms35668 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

struct segtree{
	int n; vector<int> t;
	segtree(vector<int> &a): n(a.size()){
		t.resize(2*n);
		for(int i = 0; i<n; i++) t[i+n] = a[i];
		for(int i = n-1; i > 0; i--) t[i] = t[i<<1] + t[(i<<1) | 1];
	}
	void upd(int i, int k){
		for(t[i+=n] = k; i>>=1; ) t[i] = t[i<<1] + t[(i<<1) | 1];
		return;
	}
	int q(int l, int r){
		int sol = 0;
		for(l+=n, r+=n; l<=r; l>>=1, r>>=1){
			if(l&1) sol += t[l++];
			if(!(r&1)) sol += t[r--];
		}
		return sol;
	}
};

long long count_swaps(std::vector<int> s) {
	map<int, vector<int>> idx;
	int n = (int)s.size();
	for(int i = 0; i<n; i++) idx[s[i]].push_back(i);
	map<int, int> point;
	for(int i = 0; i<n; i++) point[s[i]] = 0;
	vector<int>vv(n, 1);
	segtree sg(vv);
	long long sol = 0;
	vector<bool> vis(n, 0);
	for(int i = 0; i<n; i++){
		if(vis[i]) continue;
		int r = idx[-s[i]][point[-s[i]]];
		point[s[i]]++;
		point[-s[i]]++;
		if(r > i+1){
			sol += sg.q(i+1, r-1);
		} 
		if(s[i] > 0) sol++;
		sg.upd(i, 0);
		vis[i] = 1;
		sg.upd(r, 0);
		vis[r] = 1;
	}
	return sol;
}
#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...