Submission #1209831

#TimeUsernameProblemLanguageResultExecution timeMemory
1209831ASGA_RedSeaArranging Shoes (IOI19_shoes)C++20
10 / 100
0 ms328 KiB
/**

                                    * بسم الله الرحمن الرحيم *

                ﴾ رَبِّ اشْرَحْ لِي صَدْرِي * وَيَسِّرْ لِي أَمْرِي * وَاحْلُلْ عُقْدَةً مِّن لِّسَانِي * يَفْقَهُوا قَوْلِي ﴿

*/

/// author : "ASGA"

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

long long count_swaps(vector<int>s);

struct ft{
    vector<ll>f;
    int n;
    ft(int N){
        n=N+1;
        f.assign(n+1,0);
        for(int i=1;i<=n;i++){
            int j=i;
            while(j<=n){
                f[j]++;
                j+=j&-j;
            }
        }
    }

    void edit(int i){
        i++;
        while(i<=n){
            f[i]++;
            i+=i&-i;
        }
    }
    int get(int i){
        ll ret=0;i++;
        while(i){
            ret+=f[i];
            i-=i&-i;
        }
        return ret;
    }
};

ll count_swaps(vector<int>a){
    int n=a.size();
    ll ans=0;

    ft f(n);

    vector<array<vector<int>,2>>pos(n/2+1);
    for(int i=n-1;i>=0;i--)pos[abs(a[i])][a[i]<0].push_back(i);

    vector<int>vis(n,0);
    vector<array<int,2>>rng;
    for(int i=0;i<n;i++){
        if(vis[i])continue;

        int j=pos[abs(a[i])][a[i]>0].back();
        pos[abs(a[i])][a[i]<0].pop_back();
        pos[abs(a[i])][a[i]>0].pop_back();

        vis[j]=1;

        rng.push_back({j,i});
    }

    sort(rng.rbegin(),rng.rend());
    for(auto&[j,i]:rng){
        if(a[i]<0)ans+=f.get(j-1)-f.get(i);
        else ans+=f.get(j)-f.get(i);
        f.edit(j);
    }

    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...