제출 #195673

#제출 시각아이디문제언어결과실행 시간메모리
195673SwanArranging Shoes (IOI19_shoes)C++14
100 / 100
213 ms34012 KiB
#include <bits/stdc++.h>
#include "shoes.h"
#define stop system("pause")
#define stop2 char o; cin >> o
#define INP freopen("pcb.in","r",stdin)
#define OUTP freopen ("pcb.out","w",stdout)
using namespace std;

const int maxn = 610000;
vector<int> pos[610000];
bitset<maxn> used;

int n;

namespace fen{
    int bit[maxn];
    void upd(int id,int x){
        while(id < maxn){
            bit[id]+=x;
            id|=id+1;
        }
    }
    int sum(int r){
        int res = 0;
        while(r>=0){
            res+=bit[r];
            r&=r+1;
            r--;
        }
        return res;
    }
    int segm(int l,int r){
        int ans = sum(r);
        if(l)ans-=sum(l-1);
        return ans;
    }
}

int get_id(int x){
    if(x > 0)return x;
    else return -x+n;
}

long long count_swaps(std::vector<int> s) {
    long long ans = 0;
    n = s.size()/2;
    set<pair<int,int> > qwe;
    for(int i(0); i < s.size();i++){
        qwe.insert({i,s[i]});
        if(s[i] > 0)pos[s[i]].push_back(i);
        else{
            int id = get_id(s[i]);
            pos[id].push_back(i);
        }
    }
    for(int i(1); i <= 2*n;i++){
        reverse(pos[i].begin(),pos[i].end());
    }
    while(qwe.size()){
        if(used[qwe.begin()->first]){
            qwe.erase(qwe.begin());
            continue;
        }
        int now = -qwe.begin()->second;
        int id = get_id(now);
        int to_pos = pos[id].back();
        pos[id].pop_back();
        pos[get_id(-now)].pop_back();
        int dist = (to_pos+fen::segm(to_pos,maxn-1))-(qwe.begin()->first+fen::segm(qwe.begin()->first,maxn-1));
        //cout << "W " << (to_pos+fen::segm(to_pos,maxn-1)) << ' ' << (qwe.begin()->first+fen::segm(qwe.begin()->first,maxn-1)) << endl;
        if(qwe.begin()->second < 0)dist--;
        ans+=dist;
        used[qwe.begin()->first] = 1;
        used[to_pos] = 1;
        fen::upd(to_pos,1);
        //cout << ans << ' ' << dist << endl;
    }
    return ans;
}

/*
6
-2 2 2 -2 -2 2
*/
/*
main(){
    ios_base::sync_with_stdio(0);
    int n; cin >> n;
    vector<int> v;
    for(int i(0); i < n;i++){
        int x; cin >> x;
        v.push_back(x);
    }
    cout << count_swaps(v);
    return 0;
}*/
/*
4
2 1 -1 -2
6
-2 2 2 -2 -2 2
*/

컴파일 시 표준 에러 (stderr) 메시지

shoes.cpp: In function 'long long int count_swaps(std::vector<int>)':
shoes.cpp:48:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i(0); i < s.size();i++){
                   ~~^~~~~~~~~~
#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...