제출 #397703

#제출 시각아이디문제언어결과실행 시간메모리
397703ly20Arranging Shoes (IOI19_shoes)C++17
100 / 100
250 ms22240 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 212345;
vector <int> v[2 * MAXN];
int id1[2 * MAXN];
int seg[4 * MAXN];
int query(int cur, int ini, int fim, int a, int b) {
    if(ini > b || fim < a) return 0;
    if(ini >= a && fim <= b) return seg[cur];
    int m = (ini + fim) / 2;
    int e = 2 * cur, d = 2 * cur + 1;
    return query(e, ini, m, a, b) + query(d, m + 1, fim, a, b);
}
void update(int cur, int ini, int fim, int id, int val) {
    if(ini > id || fim < id) return;
    if(ini == fim) {
        seg[cur] = val;
        return;
    }
    int m = (ini + fim) / 2;
    int e = 2 * cur, d = 2 * cur + 1;
    update(e, ini, m, id, val); update(d, m + 1, fim, id, val);
    seg[cur] = seg[e] + seg[d];
}
long long count_swaps(vector<int> s) {
	int n = s.size();
	long long resp = 0;
    for(int i = 0; i < n; i++) {
        update(1, 0, n - 1, i, 1);
        int a = s[i];
        if(a < 0) {
            a = -a + MAXN;
        }
        v[a].push_back(i);
    }
    for(int i = 0; i < n; i++) {
        if(query(1, 0, n - 1, i, i) == 0) continue;
        if(s[i] > 0) resp++;
        int a = s[i], b = -s[i];
        if(a < 0) {
            a = -a + MAXN;
        }
        if(b < 0) {
            b = -b + MAXN;
        }
        int ida = v[a][id1[a]], idb = v[b][id1[b]];
        int q = query(1, 0, n - 1, 0, ida), r = query(1, 0, n - 1, 0, idb);
        resp += q + r - 3;
        id1[a]++; id1[b]++;
        //printf("%d %d\n", query(1, 0, n - 1, 0, ida), query(1, 0, n - 1, 0, idb));
         //resp += query(1, 0, n - 1, 0, ida) + query(1, 0, n - 1, 0, idb) - 2;
        //id1[a]++; id1[b]++;
        update(1, 0, n - 1, ida, 0); update(1, 0, n - 1, idb, 0);
        //printf("%d\n", resp);
    }
    return resp;
}
#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...