제출 #1141156

#제출 시각아이디문제언어결과실행 시간메모리
1141156altern23Arranging Shoes (IOI19_shoes)C++20
30 / 100
68 ms12200 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long

struct fenwick{
    ll n;
    vector<ll>bit;
    fenwick(ll _n = 0) : n(_n), bit(n + 5) {}
 
    void upd(ll idx, ll val){
		idx++;
        for(int i = idx; i <= n; i += i & -i) bit[i] += val;
    }
    
    ll get(ll idx){
		idx++;
        ll ans = 0;
        for(int i = idx; i >= 1; i -= i & -i) ans += bit[i];
        return ans;
    }
    
    ll query(ll l, ll r){
        if(l > r) return 0;
        return get(r) - get(l - 1);
    }
};


long long count_swaps(vector<int> s) {
	ll n = s.size();
	vector<pair<ll, ll>> isi[n + 5];
	for(int i = 0; i < n; i++){
		isi[abs(s[i])].push_back({i, s[i]});
	}	

	fenwick bit(n);

	ll ans = 0;
	vector<pair<ll, ll>> segs;

	for(ll i = 1; i <= n; i++){
		deque<ll> pos, neg;
		for(auto [idx, val] : isi[i]){
			// kalau - ketemu +
			if(val < 0){
				if(!pos.empty()){
					ans += (idx + bit.query(0, idx)) - (pos.front() + bit.query(0, pos.front()));
					bit.upd(pos.front(), 1);
					bit.upd(idx, -1);
					pos.pop_front();
				}
				else{
					neg.push_back(idx);
				}
			}
			else{
				if(!neg.empty()){
					ans += (idx + bit.query(0, idx)) - (neg.front() + bit.query(0, neg.front())) - 1;
					bit.upd(neg.front(), 1);
					bit.upd(idx, -1);
					neg.pop_front();
				}
				else{
					pos.push_back(idx);
				}
			}
		}
	}

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