제출 #146148

#제출 시각아이디문제언어결과실행 시간메모리
146148HellAngelArranging Shoes (IOI19_shoes)C++14
100 / 100
161 ms20760 KiB
#include <bits/stdc++.h>
using namespace std;
 
const int maxn = 2e5 + 7;
long long n, BIT[maxn];
bool d2[maxn];
vector<long long> q[2][maxn];
 
void Update(long long u, long long v)
{
    for(; u < maxn; u += u & -u) BIT[u]+= v;
}
 
long long Get(long long u)
{
    long long ans = 0;
    for(; u > 0; u -= u & -u) ans += BIT[u];
    return ans;
}
 
long long count_swaps(vector<int> vt)
{
    long long ans = 0;
    n = vt.size() / 2;
    for(long long i = 0; i < n * 2; i++)
    {
        if(vt[i] > 0)
        {
            q[1][vt[i]].push_back(i);
        }
        else q[0][-vt[i]].push_back(i);
        Update(i + 1, 1);
    }
    for(int i = 1; i <= n; i++) reverse(q[0][i].begin(), q[0][i].end()), reverse(q[1][i].begin(), q[1][i].end());
    int cnt = 1;
    for(int i = 0; i < n * 2; i++)
    {
        if(d2[i + 1]) continue;
        int gau = q[0][abs(vt[i])].back() + 1;
        int meo = q[1][abs(vt[i])].back() + 1;
        d2[gau] = d2[meo] = true;
        q[0][abs(vt[i])].pop_back();
        q[1][abs(vt[i])].pop_back();
        ans += Get(gau) - cnt++;
        Update(1, 1);
        Update(gau, -1);
        ans += Get(meo) - cnt++;
        Update(1, 1);
        Update(meo, -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...