Submission #1274182

#TimeUsernameProblemLanguageResultExecution timeMemory
1274182hgmhcArranging Shoes (IOI19_shoes)C++20
50 / 100
61 ms21344 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std; using ll = long long; using ii = pair<ll,ll>; using vi = vector<ll>;
#define rep(i,a,b) for (ll i = (a); i <= (b); ++i)
#define per(i,a,b) for (ll i = (b); i >= (a); --i)
#define all(x) (x).begin(), (x).end()
#define siz(x) ll((x).size())
#define Mup(x,y) (x = max(x,y))
#define mup(x,y) (x = min(x,y))
#define fi first
#define se second
#define pb push_back
#define dbg(...) fprintf(stderr,__VA_ARGS__)
// #define int do not use int

const int N = 1e5 + 3;

struct T {
	set<ll> POS[N+N];
	auto &operator [] (int idx) {
		return POS[N+idx];
	}
} pos;

struct BIT {
	ll t[2*N+2];
	void add(int k, ll x) {
		for(++k; k<=N; k+=k&-k) t[k]+=x;
	}
	ll sum(int l, int r) {
		ll res=0;
		for(; l; l-=l&-l) res-=t[l];
		for(++r; r; r-=r&-r) res+=t[r];
		return res;
	}
} ds;

ll count_swaps(vector<int> s) {
	static int counter = 0;
	assert(counter++ == 0);
	
	ll n = siz(s), cnt=0;
	
	rep(i,0,n-1) {
		pos[s[i]].insert(i);
		ds.add(i, +1);
	}
	
	rep(i,0,n-1) if(pos[s[i]].contains(i)) {
		assert(*pos[s[i]].begin() == i);
		pos[s[i]].erase(i);
		
		ll j=*pos[-s[i]].begin(); pos[-s[i]].erase(j);
		assert(i<j);
		
		cnt += ds.sum(i+1, j-1) + (s[i]>0);
		ds.add(i, -1), ds.add(j, -1);
	}
	
	return cnt;
}
#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...