Submission #1273581

#TimeUsernameProblemLanguageResultExecution timeMemory
1273581quanduongxuan12Arranging Shoes (IOI19_shoes)C++20
0 / 100
2 ms336 KiB
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;
#define name "shoes"
#define MAXN 200005
#define pb push_back
#define pf push_front
#define ll long long
#define ii pair<int, int>
#define fs first
#define sc second
#define ill pair<int, ll>
#define lli pair<ll, int>
#define llll pair<ll, ll>
#define all(v) v.begin(),v.end()
#define uni(v) v.erase(unique(all(v)),v.end())
#define bit(n,i) (((n)>>(i))&1)
#define FOR(i,a,b) for (int i=(a),_b=(b); i<=_b; i++)
#define FORD(i,a,b) for (int i=(a),_b=(b); i>=_b; i--)
#define MASK(i) (1LL<<(i))
const int INF=1e9;
const int MOD=1e9+7;
void add(int &u, int v){
    u+=v;
    if (u>=MOD) u-=MOD;
}
void sub(int &u, int v){
    u-=v;
    if (u<0) u+=MOD;
}
void minimize(ll &u, ll v){
    u=min(u,v);
}
void maximize(int &u, int v){
    u=max(u,v);
}
long long Rand(long long l, long long r){
    ll tmp=0;
    FOR(i,1,4) tmp=((tmp<<15)^(((1<<15)-1)&rand()));
    return l+tmp%(r-l+1);
}
namespace sub2{
    ll solve(vector<int> S){
        vector<int> perm;
        FOR(i,0,(int)S.size()-1) if (S[i]<0) perm.pb(i);
        vector<int> a,b;
        ll kq=1e18;
        do{
            a=S;
            b.clear();
            ll res=0;
            for (int id:perm){
                b.pb(S[id]);
                b.pb(-S[id]);
            }
            FOR(i,0,(int)S.size()-1){
                FOR(j,i,(int)S.size()-1) if (b[i]==a[j]){
                    int u=j;
                    while (u>i){
                        res++;
                        swap(a[u],a[u-1]);
                        --u;
                    }
                    break;
                }
            }
            minimize(kq,res);
        }
        while (next_permutation(all(perm)));
        return kq;
    }
}
namespace sub6{
    int bit[MAXN];
    void update(int x){
        for (; x<MAXN; x+=x&-x) bit[x]++;
    }
    int get(int x){
        int res=0;
        for (; x>0; x-=x&-x) res+=bit[x];
        return res;
    }
    bool mark[MAXN];
    vector<int> vec[2][MAXN];
    ll solve(vector<int> S){
        FORD(i,(int)S.size()-1,0){
            if (S[i]<0) vec[0][abs(S[i])].pb(i+1);
            else vec[1][S[i]].pb(i+1);
        }
        ll ans=0;
        FOR(i,1,(int)S.size()){
            if (mark[i]) continue;
            if (S[i-1]>0){
                int x=vec[0][S[i-1]].back();
                vec[0][S[i-1]].pop_back();
                vec[1][S[i-1]].pop_back();
                int tmp=get(x)-get(i);
                ans+=1LL*(x-i-tmp);
                update(x);
                mark[x]=1;
            }
            else{
                int x=vec[1][abs(S[i-1])].back();
                vec[1][abs(S[i-1])].pop_back();
                vec[0][abs(S[i-1])].pop_back();
                int tmp=get(x)-get(i);
                ans+=1LL*(x-i-tmp+1);
                update(x);
                mark[x]=1;
            }
        }
        return ans;
    }
}
ll count_swaps(vector<int> S){
    //if (S.size()<=16) return sub2::solve(S);
    return sub6::solve(S);
}
#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...