Submission #1327223

#TimeUsernameProblemLanguageResultExecution timeMemory
1327223nicolo_010Arranging Shoes (IOI19_shoes)C++20
10 / 100
1096 ms2716 KiB
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;

bool check(vector<int> s) {
	int n = s.size();
	for (int i=0; i<n; i+=2) {
		if (s[i]<0 && s[i+1]>0 && abs(s[i]) == s[i+1]) continue;
		else return false;
	}
	return true;
}

long long count_swaps(vector<int> s) {
	int n = s.size()/2;
	ll ans=0;
	while (1) {
		if (check(s)) break;
		int ordered = 2*n-1;
		for (int i=2*n-2; i>=0; i-=2) {
			//cout << i << " " << s[i] << " " << s[i+1] << endl;
			if (s[i]<0 && s[i+1]>0 && abs(s[i]) == s[i+1]) {
				ordered = i-1;
			}
			else break;
		}
		//cout << ordered << endl;
		if (ordered <= 0) break;
		int idx1=ordered;
		for (int i=ordered; i>=0; i--) {
			if (s[i] < 0) {
				idx1 =  i;
				break;
			}
		}
		int val = s[idx1];
		int idx2 = ordered;
		for (int i=ordered; i>=0; i--) {
			if (s[i] > 0 && s[i] == abs(val)) {
				idx2 = i;
				break;
			}
		}
		s.erase(s.begin()+idx1);
		s.insert(s.begin()+ordered, val);
		s.erase(s.begin()+idx2-(idx1<idx2));
		s.insert(s.begin()+ordered, abs(val));
		if (idx1<idx2) {
			ans += ordered-idx2;
			ans += (ordered-1)-idx1;
		}
		else {
			ans += ordered-idx1;
			ans += ordered-idx2;
		}
	}
	return ans;
}
//3
//-2 2 2 -2 -2 2

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