제출 #1364696

#제출 시각아이디문제언어결과실행 시간메모리
1364696lizi14Arranging Shoes (IOI19_shoes)C++20
25 / 100
107 ms75948 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+1;
    vector<int>mc(n+1);
    int ka=1;
    map<int,queue<int>>mp;
    
    for(int i=1; i<=2*n; i++){
        bati[i]=s[i-1];
        
        if(bati[i]<0){
            mc[ka]=i;
            ka++;
        }
        else{
            mp[bati[i]].push(i);
        }
    }
    
    // for(int i=1; i<=2*n; i++){
    //     queue<int>q=mp[bati[i]];
    //     cout<<q.front()<<endl;
    // }
    if(n==1){
        if(s[0]<0 && s[1]>0){
            return 0;
        }
        else return 1;
    }
    long long cnt=0;
    // for(int i=0; i<2*n; i++){
        
    // }
    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;
    int k=0;
    // for(int i=1; i<=2*n; i++){
    //     
    // }
    vector<pair<int,int>>v(n);
    //cout<<n<<endl;
    for(int i=1; i<=n; i++){
        int a=mc[i];
        int aa=(-1)*bati[a];
        //queue<int>q=mp[aa];
        
        int b=mp[aa].front();
        //cout<<b<<" "<<i<<endl;
        mp[aa].pop();
        //mp[aa]=q;
        v[i-1]={a,b};
    }
    //sort(v.begin(),v.end());
    // for(int i=0; i<n; i++){
    //     cout<<v[i].first<<" "<<v[i].second<<endl;
    // }
    
    for(int i=0; i<n; i++){
        int a=v[i].first;
        int b=v[i].second;
        //cout<<a<<" "<<b<<endl;
        //k++;
        int y=read(b);
        //cout<<y<<" ";
        long long ans1=abs(a-(b+y))-1;
        if(b+y<a){
            ans1++;
        }
        //cout<<ans1<<endl;
        ans+=ans1;
        update(min(a,b),+1);
        update(max(b,a)+1,-1);
    }
    
    return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…