Submission #1236399

#TimeUsernameProblemLanguageResultExecution timeMemory
1236399marizaArranging Shoes (IOI19_shoes)C++20
45 / 100
165 ms152252 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define MID ((l+r)/2)

struct node{
    ll val;
    node *L, *R;

    void init(ll l, ll r){
        val=0;

        if(l!=r){
            L=new node;
            L->init(l,MID);

            R=new node;
            R->init(MID+1,r);
        }
    }

    void upd(ll l, ll r, ll i){
        if(l==i && i==r){
            val=1;
        }
        else if(l<=i && i<=r){
            val++;
            L->upd(l,MID,i);
            R->upd(MID+1,r,i);
        }
    }

    ll ans(ll l, ll r, ll tl, ll tr){
        if(tl<=l && r<=tr) return val;
        else if(r<tl || tr<l) return 0;
        else return L->ans(l,MID,tl,tr) + R->ans(MID+1,r,tl,tr);
    }
};

long long count_swaps(vector<int> s){
    ll n=s.size()/2;

    queue<ll> l[n+1], r[n+1];
    ll c=0;
    for(ll i=0; i<2*n; i++){
        if(s[i]<0){
            l[-s[i]].push(2*c);
            r[-s[i]].push(2*c+1);
            // cout<<-s[i]<<" "<<2*i<<endl;
            c++;
        }
    }
    // cout<<"ok1"<<endl;

    vector<ll> s2;
    ll pos[2*n];
    for(ll i=0; i<2*n; i++){
        if(s[i]<0){
            s2.push_back(l[-s[i]].front());
            pos[l[-s[i]].front()]=s2.size()-1;
            l[-s[i]].pop();
        }
        else{
            s2.push_back(r[s[i]].front());
            pos[r[s[i]].front()]=s2.size()-1;
            r[s[i]].pop();
        }
    }
    // cout<<"ok2"<<endl;

    node seg;
    seg.init(0,2*n-1);
    // cout<<"ok3"<<endl;

    ll ans=0;
    for(ll i=2*n-1; i>=0; i--){
        // cout<<i<<endl;
        ans+=seg.ans(0,2*n-1,0,pos[i]);
        seg.upd(0,2*n-1,pos[i]);
        // cout<<i<<endl;
    }
    
    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...