Submission #1203822

#TimeUsernameProblemLanguageResultExecution timeMemory
1203822AvianshArranging Shoes (IOI19_shoes)C++20
100 / 100
616 ms148068 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

struct segTree{
    int *st;
    int n;
    segTree(int siz){
        int x = ceil(log2(siz));
        x++;
        st=new int[(1<<x)];
        fill(st,st+(1<<x),0);
        n=siz-1;
        for(int i = 0;i<siz;i++){
            update(i,1);
        }
    }

    void rupdate(int l, int r, int i, int val, int ind){
        if(i<l||i>r){
            return;
        }
        if(l==r){
            st[ind]=val;
            return;
        }
        int mid = (l+r)/2;
        rupdate(l,mid,i,val,2*ind+1);
        rupdate(mid+1,r,i,val,2*ind+2);
        st[ind]=st[ind*2+1]+st[ind*2+2];
    }

    void update(int i, int val){
        rupdate(0,n,i,val,0);
    }

    int rquery(int l, int r, int s, int e, int ind){
        if(e<l||s>r){
            return 0;
        }
        if(s<=l&&r<=e){
            return st[ind];
        }
        int mid = (l+r)/2;
        return rquery(l,mid,s,e,ind*2+1)+rquery(mid+1,r,s,e,ind*2+2);
    }

    int query(int l, int r){
        return rquery(0,n,l,r,0);
    }
};

long long count_swaps(vector<int> s) {
    long long ans = 0;
    int n = s.size();
    map<int,queue<int>>mp;
    for(int i = 0;i<n;i++){
        mp[s[i]].push(i);
    }
    segTree st(n);
    for(int i = 0;i<n;i++){
        if(st.query(i,i)==0)
            continue;
        int ind = mp[-s[i]].front();
        mp[-s[i]].pop();
        mp[s[i]].pop();
        st.update(i,0);
        if(s[i]<0){
            ans+=st.query(i,ind)-1;
        }
        else{
            ans+=st.query(i,ind);
        }
        st.update(ind,0);
    }
	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...