Submission #589426

#TimeUsernameProblemLanguageResultExecution timeMemory
589426farhan132Arranging Shoes (IOI19_shoes)C++17
100 / 100
77 ms20732 KiB
#include "shoes.h"
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef pair<ll , ll> ii;
 
#define ff first
#define ss second
#define pb push_back
#define in insert

const ll N = 2e5 + 5;

struct fenwick{
  ll ft[N];
  void build(){
  	memset(ft, 0 ,sizeof(ft));
  	return;
  }
  void up(ll p, ll x) {
    for(; p < N; p += p & -p)
      ft[p] += x;
  } 
  ll sum(ll l, ll r) {
  	if(r < l) return 0;
    ll ret = 0;
    for(--l; l > 0; l -= l & -l) ret -= ft[l];
    for(; r > 0; r -= r & -r) ret += ft[r];
    return ret;
  }
};

ll a[N];
vector < ll > v0[N], v1[N];

long long count_swaps(std::vector<int> s) {

	ll n = s.size() / 2;

	fenwick T; T.build();

	for(ll i = 1; i <= 2*n; i++){
		a[i] = s[i - 1];
		T.up(i, 1);
		if(a[i] < 0) v0[-a[i]].pb(i);
		else v1[a[i]].pb(i);
	}
	for(ll i = n; i >= 1; i--){
		reverse(v1[i].begin(), v1[i].end());
		reverse(v0[i].begin(), v0[i].end());
	}
	ll ans = 0;
	for(ll i = 1; i <= 2*n; i++){
		if(T.sum(i, i) == 0) continue;
		ll S = abs(a[i]);
		ll st[2] = {v0[S].back(), v1[S].back()};
		T.up(st[0], -1);
		T.up(st[1], -1);
		ans += T.sum(i, st[0]) + T.sum(i, st[1]) + (st[1] < st[0]);
		v0[S].pop_back();
		v1[S].pop_back();
	}

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