Submission #1292671

#TimeUsernameProblemLanguageResultExecution timeMemory
1292671MMihalevArranging Shoes (IOI19_shoes)C++20
10 / 100
162 ms269660 KiB
#include<iostream>
#include<vector>
#include<queue>
#include<set>
#include "shoes.h"
using namespace std;
const int MAX_N=2e5+5;
deque<int>pos[2][MAX_N];
int tree[MAX_N];
int N;
void Update(int pos)
{
    pos++;
    for(;;)
    {
        if(pos>N)break;
        tree[pos]++;
        pos+=((pos)&(-pos));
    }
}
int Find(int pos)
{
    int res=0;
    pos++;
    for(;;)
    {
        if(pos<1)break;
        res+=tree[pos];
        pos-=((pos)&(-pos));
    }
    return res;
}
bool ban[MAX_N];
long long count_swaps(std::vector<int> s)
{
    N=s.size();

    for(int i=0;i<s.size();i++)
    {
        if(s[i]<0)pos[0][-s[i]].push_back(i);
        else pos[1][s[i]].push_back(i);
    }
        long long ans=0;


    int cnt=0;
    for(int i=0;i<s.size();i++)
    {
        if(ban[i])continue;
        int wh=1-(s[i]<0 ? 0 : 1);
        int cur=pos[wh][abs(s[i])].front()-Find(pos[wh][abs(s[i])].front())+cnt-i-wh;
        ans+=cur;
        Update(pos[wh][abs(s[i])].front());
        cnt++;
        ban[pos[wh][abs(s[i])].front()]=1;
        pos[wh][abs(s[i])].pop_front();
        pos[1-wh][abs(s[i])].pop_front();
    }

    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...