제출 #1310414

#제출 시각아이디문제언어결과실행 시간메모리
1310414DangerNoodle7591Arranging Shoes (IOI19_shoes)C++20
100 / 100
109 ms32212 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC target ("avx2")
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
 
#define lalala ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
//#define int long long int
#define N 200005
//#define big 1000000000000000
//#define fark 0.0000001
#define ll long long
//#define endl "\n"
#define pb push_back
#define ins insert
#define p push
#define f first
#define s second

set<int> sag[N];
set<int> sol[N];

int seg[N*4];
void up(int x,int l,int r,int hed){
    if(l>r)return;
    if(l==r){
        seg[x]=1;return;
    }
    int mid=(l+r)/2;
    if(hed<=mid)up(x*2,l,mid,hed);
    else up(x*2+1,mid+1,r,hed);
    seg[x]=seg[x*2]+seg[x*2+1];
}
int qua(int x,int l,int r,int s,int e){
    if(l>r||r<s||e<l)return 0;
    if(s<=l&&r<=e){
        return seg[x];
    }
    int mid=(l+r)/2;
    return qua(x*2,l,mid,s,e)+ qua(x*2+1,mid+1,r,s,e);
}

ll int count_swaps(vector<int> S){
    for(int i=0;i<S.size();i++){
        if(S[i]<0){
            sol[-S[i]].ins(i);
        }
        else sag[S[i]].ins(i);
    }
    ll int cev=0;
    for(int i=0;i<S.size();i++){
        if(qua(1,1,S.size(),i+1,i+1)==1)continue;
        if(S[i]<0){
            int yer=(*sag[-S[i]].upper_bound(i));
            sag[-S[i]].erase(yer);
            int ara=qua(1,1,S.size(),i+1,yer+1);
            //cout<<i<<" a "<<yer<<" "<<ara<<endl;
            cev+=(yer-i-1)-ara;
            up(1,1,S.size(),yer+1);
        }
        else{
            int yer=(*sol[S[i]].upper_bound(i));
            sol[S[i]].erase(yer);
            int ara=qua(1,1,S.size(),i+1,yer+1);
            //cout<<i<<" b "<<yer<<" "<<ara<<endl;
            cev+=(yer-i)-ara;
            up(1,1,S.size(),yer+1);
        }
        //cout<<cev<<endl;
    }
    return cev;
    
}
#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...