Submission #707733

#TimeUsernameProblemLanguageResultExecution timeMemory
707733Urvuk3Arranging Shoes (IOI19_shoes)C++17
100 / 100
120 ms23576 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
const int INF=1e9;
const ll LINF=1e18;
#define fi first
#define se second
#define pii pair<int,int>
#define mid ((l+r)/2)
#define sz(a) (int((a).size()))
#define all(a) a.begin(),a.end()
#define endl "\n"
#define PRINT(x) cerr<<#x<<'='<<x<<endl;
#define pb push_back
#define PRINTvec(niz) { cerr<<#niz<<"="; for(auto _i:niz) cerr<<_i<<" "; cerr<<endl; }

int mxN=2e5+1;

vector<int> seg(4*mxN+1);
vector<vector<int>> l(mxN),r(mxN);

void Init(int node,int l,int r){
    if(l==r){
        seg[node]=1;
        return;
    }
    Init(2*node,l,mid); Init(2*node+1,mid+1,r);
    seg[node]=seg[2*node]+seg[2*node+1];
}

void Update(int node,int l,int r,int idx,int val){
    if(idx>r) return;
    if(l==r){
        seg[node]+=val;
        return;
    }
    if(idx<=mid) Update(2*node,l,mid,idx,val);
    else Update(2*node+1,mid+1,r,idx,val);
    seg[node]=seg[2*node]+seg[2*node+1];
}

int Query(int node,int l,int r,int L,int R){
    if(L<=l && r<=R) return seg[node];
    int ret=0;
    if(L<=mid) ret+=Query(2*node,l,mid,L,R);
    if(R>mid) ret+=Query(2*node+1,mid+1,r,L,R);
    return ret;
}

long long count_swaps(vector<int> a){
    int N=sz(a)/2;
    for(int i=0;i<2*N;i++){
        if(a[i]<0) l[-a[i]].pb(i+1);
        else r[a[i]].pb(i+1);
    }
    vector<pair<pii,int>> parovi;
    for(int i=1;i<mxN;i++){
        for(int j=0;j<sz(l[i]);j++){
            int L=l[i][j],R=r[i][j];
            parovi.pb({{min(L,R),max(L,R)},L>R});
        }
    }
    sort(all(parovi));
    ll res=0;
    Init(1,1,2*N);
    for(auto p:parovi){
        int L=p.fi.fi,R=p.fi.se,x=p.se;
        //PRINT(L); PRINT(R); PRINT(x);
        //PRINT(Query(1,1,2*N,1,R));
        //PRINT(Query(1,1,2*N,1,L));
        res+=abs(Query(1,1,2*N,1,R)-Query(1,1,2*N,1,L))-1+x;
        //PRINT(res);
        Update(1,1,2*N,L+1,1);
        Update(1,1,2*N,R,-1);

    }
    return res;
}
#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...