제출 #154592

#제출 시각아이디문제언어결과실행 시간메모리
154592juckterArranging Shoes (IOI19_shoes)C++14
100 / 100
109 ms15736 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> ii;

const int MAXN = 2e5 + 5;
int BIT[MAXN];

void upd(int p, int v) {
    for(; p < MAXN; p += (p & -p)) BIT[p] += v;
}

int sum(int p) {
    int tot = 0;
    for(; p; p -= (p & -p))
        tot += BIT[p];
    return tot;
}

long long count_swaps(vector<int> s) {
    int n = s.size() / 2;
    vector<vector<int>> positions(2*n + 2);
    vector<int> taken(2*n);
    fill(taken.begin(), taken.end(), 0);
    fill(BIT, BIT + MAXN, 0);
    for(int i = 1; i <= 2*n; i++)
        upd(i, 1);
    for(int i = 2*n - 1; i >= 0; i--)
        positions[s[i] + n].push_back(i);
    long long ans = 0;
    for(int i = 0; i < 2*n; i++) {
        if(taken[i])
            continue;
        int p = positions[n - s[i]].back();
        positions[n - s[i]].pop_back();
        positions[s[i] + n].pop_back();
        if(s[i] > 0) {
            ans += sum(p);
            upd(i + 1, -1);
        }
        else {
            upd(i + 1, -1);
            ans += sum(p);
        }
        upd(p + 1, -1);
        taken[i] = taken[p] = 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...