Submission #1364847

#TimeUsernameProblemLanguageResultExecution timeMemory
1364847lizi14Arranging Shoes (IOI19_shoes)C++20
100 / 100
293 ms149140 KiB
#include "shoes.h"
#include <cstdio>
#include <cassert>
#include <bits/stdc++.h>
using namespace std;

//#include "shoes.h"
long long MAXVAL;
const int N=2e5+5;
int tree[4*N];
void update(int idx,int val){
    while(idx<=MAXVAL){
        tree[idx]+=val;
        idx+=(idx&(-idx));
    }
}
int read(int idx){
    int sum=0;
    while(idx>0){
        sum+=tree[idx];
        idx=idx-(idx&(-idx));
    }
    return sum;
}
long long count_swaps(vector<int> s) {
    long long n=s.size()/2;
    long long bati[2*n+1];
    MAXVAL=2*n;
    map<int,queue<int>>mp;
    int ka=0;
    if(s[0]>0)ka=1;
    for(int i=1; i<=2*n; i++){
        bati[i]=s[i-1];
        mp[bati[i]].push(i);
    }
    
    if(n==1){
        if(s[0]<0 && s[1]>0){
            return 0;
        }
        else return 1;
    }
    long long cnt=0;
    for(int i=0; i<n; i++){
        if(!(abs(s[i])==s[i+n] && s[i]<0)){
            cnt=1;
            break;
        }
    }
    if(cnt==0){
        return (n*(n-1)/2);
    }
    int c[2*n+1];
    fill(c,c+2*n+1,0);
    long long ans=0;
    vector<pair<int,int>>v;
    for(int i=1; i<=2*n; i++){
        if(c[i]==1)continue;
        
        int f=i;
        int ss=mp[-bati[i]].front();
        mp[bati[i]].pop();
        mp[-bati[i]].pop();
        c[f]=1;
        c[ss]=1;
        ans+=ss-f-1;
        if(bati[i]>0){
            ans++;
        }
        ans-=read(ss)-read(f);
        update(ss,1);
        //update(ss+1,-1);
        //v.push_back({f,ss});
        
    }
    
    return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...