Submission #1334556

#TimeUsernameProblemLanguageResultExecution timeMemory
1334556yc11Arranging Shoes (IOI19_shoes)C++20
10 / 100
0 ms344 KiB
#include<bits/stdc++.h>
using namespace std;
int64_t count_swaps(vector<int> S){
    struct node{
        int s,e,m,val;
        node *l, *r;
        node(int _s,int _e):
            s(_s),e(_e),m((_s+_e)/2),val(0){
                if (s!=e){
                    l = new node(s,m);
                    r = new node(m+1,e);
                }
            }
        void update(int p, int v){
            if (s==e) {val+=v;return;}
            if (p>m) r->update(p,v);
            else l->update(p,v);
            val = l->val+r->val;
        }
        int query(int a, int b){
            if (b<s or a>e) return 0;
            if (a<=s and b>=e) return val;
            return l->query(a,b)+r->query(a,b);
        }

    };
    node *root = new node(0,S.size()-1);
    for (int i = 0;i<S.size();i++) root->update(i,1);

  vector<vector<int64_t> >l;
    vector<vector<int64_t> >r;
    l.resize(S.size()/2+1);
    r.resize(S.size()/2+1);
    int64_t ans = 0;
    for (int i = 0;i<S.size();i++){

        if (S[i]<0) {
            l[S[i]*-1].push_back(i);
        }
        else{
            r[S[i]].push_back(i);
        }

    }
    for (int i = 1;i<=S.size()/2;i++){
     
        for (int j = 0;j<l[i].size();j++){
            if (l[i][j]>r[i][j]){
          
                ans = ans+root->query(r[i][j],l[i][j]-1);
            
                root->update(l[i][j],1);
                root->update(r[i][j],-1);
            }
            else{
                ans = ans+root->query(l[i][j]+1,r[i][j]-1);
                root->update(l[i][j],1);
                root->update(r[i][j],-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...