Submission #298303

#TimeUsernameProblemLanguageResultExecution timeMemory
298303RayaabualjamalArranging Shoes (IOI19_shoes)C++14
100 / 100
606 ms30072 KiB
#include "shoes.h"
#include <cassert>

#include <iostream> 
#include <iterator>
#include <cmath>
#include <algorithm>
#include <vector> 
#include <map> 
#include <cstdio>
#define rep(i,a,b) for(int i = a; i<b; i++)
#define per(i,a,b) for(int i = a; i>=b; i--)
#define pb push_back
#define se second
using namespace std;
void update(vector <int>&tre, int v, int l, int r, int pos, int val){
	if(l==r){
		tre[v]=val;
		return;
	}
	int m = (l+r)/2;
	if(pos<=m){
		update(tre, v+v, l, m, pos, val);
	}else{
		update(tre, v+v+1, m+1, r, pos, val);
	}
	tre[v] = tre[v+v] + tre[v+v+1];
}
int sum(vector <int>&tre, int v, int l, int r, int rl, int rr){
	if(r<rl||rr<l){
		return 0;
	}
	if(rl<=l&&r<=rr){
		return tre[v];
	}
	int m = (l+r)/2;
	return sum(tre, v+v, l, m, rl, rr)+sum(tre,v+v+1, m+1, r, rl , rr);
}
long long count_swaps(vector<int> s) {
	int n = s.size();
	long long ans = 0; 
	map <int, vector <int> > m;
	vector <int> tree(4*(n+4), 0);
	rep(i,0,n){
		update(tree, 1,1,n+2,i+1, 1);
	}
	rep(i,0,n){
		m[s[i]].pb(i);
	}
	for(auto& vec:m){
		reverse(vec.se.begin(), vec.se.end());
	}
	vector <int> vis(n+n, 0);
	rep(i,0,n){
		if(vis[i])continue;
		//cout << i << " ";
		if(s[i]<0){
			int pos = m[-s[i]].back();
			//cout << pos << " 1" << endl;
			ans += sum(tree, 1, 1, n+2, i+2, pos);
			update(tree, 1,1,n+2,i+1, 0);
			update(tree, 1,1,n+2,pos+1, 0);
			vis[i]=1;
			vis[pos]=1;
		}else{
			int pos = m[-s[i]].back();
			//cout << pos << " 2" << endl;
			ans += sum(tree, 1, 1, n+2, i+1, pos);
			update(tree, 1,1,n+2,i+1, 0);
			update(tree, 1,1,n+2,pos+1, 0);
			vis[i]=1;
			vis[pos]=1;
		}
		m[-s[i]].pop_back();
		m[s[i]].pop_back();
		//cout << ans << endl;
	}
	//cout << "ans: " << ans << endl;
	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...