제출 #1201001

#제출 시각아이디문제언어결과실행 시간메모리
1201001nvc2k8Arranging Shoes (IOI19_shoes)C++20
100 / 100
41 ms15432 KiB
#include <bits/stdc++.h>
#include "shoes.h"
#define TASK "shoes"
#define INT_LIM (int) 2147483647
#define LL_LIM (long long) 9223372036854775807
#define endl '\n'
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define BIT(i,x) (((i)>>(x))&1)
#define FOR(i,a,b) for(int i = (a); i<=(b); i++)
#define FORD(i,a,b) for(int i = (a); i>=(b); i--)
#define ll long long
#define pii pair<int,int>
using namespace std;
///------------------------------------------///
int n;
vector<int> lshoes[100005];
vector<int> rshoes[100005];
int lptr[100005], rptr[100005];
int a[200005];
bool dd[200005];
int f[200005];

void update(int u, int delta)
{
    for (int i = u; i<=n; i+=(i&(-i))) f[i]+=delta;
}

int get(int u)
{
    int ret = 0;
    for (int i = u; i>0; i-=(i&(-i))) ret+= f[i];
    return ret;
}

ll count_swaps(vector<int> s)
{
    n = s.size();
    FOR(i, 0, n-1)
    {
        if (s[i]<0)
        {
            lshoes[-s[i]].pb(i);
        }
        else
        {
            rshoes[s[i]].pb(i);
        }
    }

    int cur = 0;
    for (int i = 0; i<n; i++) if (!dd[i])
    {
        int ss = abs(s[i]);
        int x = lshoes[ss][lptr[ss]];
        int y = rshoes[ss][rptr[ss]];
        dd[x] = true; dd[y] = true;
        lptr[ss]++; rptr[ss]++;
        a[x+1] = ++cur;
        a[y+1] = ++cur;
    }

    ll ret = 0;

    FORD(i, n, 1)
    {
        ret+= (ll) get(a[i]);
        update(a[i], 1);
    }

    return ret;
}
#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...