제출 #1215215

#제출 시각아이디문제언어결과실행 시간메모리
1215215ColourAttilaArranging Shoes (IOI19_shoes)C++17
10 / 100
1 ms1864 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const ll maxN = 2e5+5;


ll segtree[800001];

ll query(ll v, ll vl, ll vr, ll ql, ll qr) {
	if (ql > qr) return 0;
	if (vr == qr && vl == ql) return segtree[v];
	ll mid = (vl + vr) / 2;

	return query(v*2, vl, mid, ql, min(qr, mid)) + query(v*2 + 1, mid + 1, vr, max(mid + 1, ql), qr);
}

void update(ll v, ll vl, ll vr, ll pos, ll val) {
	if (vl == vr) segtree[v] += val;
	else {
		ll mid = (vl + vr) / 2;
		if (pos <= mid) {
			update(v*2, vl, mid, pos, val);
		}
		else{
			update(v*2 + 1, mid + 1, vr, pos, val);
		}
		segtree[v] = segtree[v*2] + segtree[v*2 + 1];
	}
}

long long count_swaps(vector <int> v){

	ll n = v.size();
    map<ll, vector<ll> > Neg, Pos;

	for(ll i = 0; i < n; i++){
   		if(v[i] < 0) Neg[- v[i]].push_back(i+1);
   		else Pos[v[i]].push_back(i+1);
    }
    ll res = 0;


    vector<ll> ind(maxN, 0);
    vector<bool> volt(n+1, 0);

    vector<pair<ll, ll> > pairs;
    for(ll i = 0; i < n; i++) {
        if(volt[i]) continue;
    	ll val = abs(v[i]);

    	ll x = Neg[val][ind[val]];
    	ll y = Pos[val][ind[val]++];
    	
    	volt[x-1] = volt[y-1] = 1;

    	pairs.push_back({min(x, y), max(x, y)});

        if(x < y) {
            res += y-x-1;
        }
        else {
            res += x-y;
        }
    }

    
    ll over = 0;
	for(auto p : pairs) {
        over += query(1, 1, n, p.first, p.second);
        update(1, 1, n, p.first, 1);
    }

	return res - over;
}

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