제출 #819813

#제출 시각아이디문제언어결과실행 시간메모리
819813BulaArranging Shoes (IOI19_shoes)C++14
50 / 100
338 ms34388 KiB
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;

#define ll long long
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define ff first
#define sc second
//#define int ll
const ll mod=1e9+7, N = 2e5 + 1; 
vector<int> t(4 * N);

int get(int v, int tl, int tr, int l, int r) {
    if (l > r) 
        return 0;
    if (l == tl && r == tr) {
        return t[v];
    }
    int tm = (tl + tr) / 2;
    
    return get(v*2, tl, tm, l, min(r, tm))+get(v*2+1, tm+1, tr, max(l, tm+1), r);
}
 
void up(int v, int tl, int tr, int pos, int new_val) {
    if (tl == tr) {
        t[v] = new_val;
    } else {
        int tm = (tl + tr) / 2;
        if (pos <= tm)
            up(v*2, tl, tm, pos, new_val);
        else
            up(v*2+1, tm+1, tr, pos, new_val);
        t[v] = t[v*2]+t[v*2+1];
    }
}


ll count_swaps(vector<int> s){
	int n = s.size();
	map<int, set<int> > v;
	for(int i = 0; i < n; i++){
		v[s[i]].insert(i);
	}
	
	int ans = 0;
	for(int i = 0; i < n; i++){
		if(get(1, 0, n - 1, i, i) != 0) continue;
		int id = *v[-s[i]].begin();
		v[s[i]].erase(v[s[i]].begin());
		v[-s[i]].erase(v[-s[i]].begin());
		if(s[i] > 0) ans++;
		ans += id - i - 1 - get(1, 0, n - 1, i + 1, id - 1);
		up(1, 0, n - 1, id, 1);
		up(1, 0, n - 1, i, 1);
	}
	
	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...