Submission #414044

#TimeUsernameProblemLanguageResultExecution timeMemory
414044illyakrArranging Shoes (IOI19_shoes)C++14
10 / 100
4 ms5028 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

int n;
int a[201010];
int t[801010];
int tAdd[801010];
void build(int v, int vl, int vr) {
    if (vl == vr) {
        t[v] = vl;
        return;
    }
    int vm = (vl + vr) / 2;
    build(2 * v, vl, vm);
    build(2 * v + 1, vm + 1, vr);
}
void push(int v, int vl, int vr) {
    if (tAdd[v] == 0)return;
    if (vl == vr)t[v] += tAdd[v];
    else {
        tAdd[2 * v] += tAdd[v];
        tAdd[2 * v + 1] += tAdd[v];
    }
    tAdd[v] = 0;
}
void upd(int v, int vl, int vr, int l, int r, int val) {
    push(v, vl, vr);
    if (l <= vl && vr <= r) {
        tAdd[v] += val;
        push(v, vl, vr);
        return;
    }
    if (r < vl || vr < l)return;
    int vm = (vl + vr) / 2;
    upd(2 * v, vl, vm, l, r, val);
    upd(2 * v + 1, vm + 1, vr, l, r, val);
}
int get(int v, int vl, int vr, int pos) {
    if (vl == vr)return t[v];
    int vm = (vl + vr) / 2;
    if (pos <= vm)return get(2 * v, vl, vm, pos);
    else return get(2 * v + 1, vm + 1, vr, pos);
}

vector<int> g[201010];
int pointer[201010];
int ans = 0;
bool used[201010];
int ID[201010];
long long count_swaps(std::vector<int> s) {
    n = s.size();
    for (int i = 1; i <= n; i++)
        a[i] = s[i - 1];
    build(1, 1, n);
    for (int i = 1; i <= n; i++)
        g[a[i] + n + 1].push_back(i);
    for (int i = 1; i <= n; i++)ID[i] = i;

    for (int i = 1; i <= n; i++) {
        if (used[i])continue;
        if (a[i] < 0) {
            for (int j = i + 1; j <= n; j++) {
                if (a[j] == -a[i]) {
                    ans += (ID[j] - ID[i] - 1);
                    used[i] = true;
                    used[j] = true;
                    break;
                }
                ID[j]++;
            }
            continue;
        }
        if (a[i] > 0) {
            for (int j = i + 1; j <= n; j++) {
                ID[j]++;
                if (a[j] == -a[i]) {
                    ans += (ID[j] - ID[i] - 1);
                    used[i] = true;
                    used[j] = true;
                    break;
                }
            }
            continue;
        }
    }
    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...