Submission #294891

#TimeUsernameProblemLanguageResultExecution timeMemory
294891juggernautArranging Shoes (IOI19_shoes)C++14
100 / 100
328 ms143096 KiB
#include<bits/stdc++.h>
#include"shoes.h"
using namespace std;
int tree[800005],flag[800005];
bool vis[200005];
queue<int>pos[2][100005];
void push(int v,int l,int r){
    if(l!=r){
        flag[v<<1]+=flag[v];
        flag[(v<<1)+1]+=flag[v];
    }
    tree[v]+=flag[v]*(r-l+1);
    flag[v]=0;
}
int get(int v,int l,int r,int ql,int qr){
    if(r<ql||qr<l)return 0;
    push(v,l,r);
    if(ql<=l&&r<=qr)return tree[v];
    int mid=(l+r)>>1;
    return get(v<<1,l,mid,ql,qr)+get((v<<1)+1,mid+1,r,ql,qr);
}
void update(int v,int l,int r,int ql,int qr,int val){
    if(r<ql||qr<l)return;
    push(v,l,r);
    if(ql<=l&&r<=qr){
        flag[v]+=val;
        push(v,l,r);
        return;
    }
    int mid=(l+r)>>1;
    update(v<<1,l,mid,ql,qr,val);
    update((v<<1)+1,mid+1,r,ql,qr,val);
    tree[v]=tree[v<<1]+tree[(v<<1)+1];
}
long long count_swaps(vector<int>v){
    long long cnt=0;
    int q=0,i=0,n=v.size();
    for(;i<n;i++)pos[v[i]>0][abs(v[i])].push(i);
    for(i=0;i<n;i++){
        if(vis[i])continue;
        q=pos[v[i]<0][abs(v[i])].front();
        pos[v[i]<0][abs(v[i])].pop();
        pos[v[i]>0][abs(v[i])].pop();
        vis[q]=1;
        cnt+=abs(get(1,1,n,i+1,i+1)+i-(get(1,1,n,q+1,q+1)+q));
        if(v[i]<0)cnt--;
        update(1,1,n,i+1,q+1,1);
    }
    return cnt;
}
#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...