제출 #294058

#제출 시각아이디문제언어결과실행 시간메모리
294058Leonardo16Arranging Shoes (IOI19_shoes)C++14
100 / 100
262 ms139544 KiB
///   Code by Leonardo16
/// “Your focus determines your reality.” – Qui-Gon Jinn
#include<bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
//#pragma GCC option("arch=native","tune=native","no-zero-upper")
//#pragma GCC target("avx2")
//#define int  long long
#define ll long long
#define sz size
#define ull unsigned long long
#define ld long double
#define ii pair<int,int>
#define fst first
#define scd second
#define vi vector<int>
#define vii vector<ii>
#define pb push_back
#define pf push_front
#define fl '\n'
#define el endl
#define all(x) x.begin() , x.end()
#define rall(x) x.rbegin() , x.rend()
/// Functions
#define db(x) cerr << #x << ": " << (x) << '\n';
#define random() __builtin_ia32_rdtsc()
#define lg2(x) 31-__builtin_clz(x)
#define lg2ll(x) 63-__builtin_clzll(x)
#define pi acos(-1)
#define YN(x) cout<<((x)?("YES"):("NO"))<<fl;
#define yn(x) cout<<((x)?("Yes"):("No"))<<fl;
#define des(x,s1,s2,end1,end2) cout<<((x)?(s1):(s2))<<fl;if(x){end1;}else{end2;}
#define precision(x) cout.setf(ios::fixed);cout.precision(x);
/// Red-Black Tree Template
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
//typedef tree < long long ,  null_type ,  less<long long> ,  rb_tree_tag ,  tree_order_statistics_node_update > ordered_set;
//#define less_than(n) order_of_key(n)
//#define en_pos(n) find_by_order(n)
/// Prime numbers  173,179,311,331,737,1009,2011,2027,3079,4001,100003
///=====================================================================
deque<ll>neg[100005],pos[100005];
ll abi[200005];


void update(int pos,int val){
    while(pos<200005){
        abi[pos]+=val;
        pos+=(pos&-pos);
    }
}

ll query(int pos){
    ll ret=0;
    while(pos>0){
        ret+=abi[pos];
        pos-=(pos&-pos);
    }
    return ret;
}


ll count_swaps(vi v){
    int n=v.sz();
    ll ans=0;

    for(int i=0;i<n;i++){

//        cout<<i<<"------>"<<v[i]<<fl;
        if(v[i]>0){
            if(neg[v[i]].sz()!=0){
//                cout<<ans<<" ";
                ans+=query( neg[v[i]][0]-1 );
                update(neg[v[i]][0],-1);
                neg[v[i]].pop_front();
                ans+=query(i+1);
//                cout<<ans<<fl;
            }else{
                pos[v[i]].pb(i+1);
                update(i+1,1);
            }
        }else{
            if(pos[abs(v[i])].sz()!=0){
//                cout<<ans<<" ";
                ans+=query( pos[abs(v[i])][0] -1);
                update(pos[ abs(v[i])][0],-1);
                pos[abs(v[i])].pop_front();
                ans+=query(i+1)+1;
//                cout<<ans<<fl;
            }else{
                neg[ abs(v[i]) ].pb(i+1);
                update(i+1,1);
            }
        }


    }
    return ans;
}


//int main(){
//    vi v={-1,-2,1,-3,-4,4,-1,2,3,1};
//    cout<<count_swaps(v)<<fl;
//}
//
//

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