제출 #1343522

#제출 시각아이디문제언어결과실행 시간메모리
1343522mydknArranging Shoes (IOI19_shoes)C++17
100 / 100
104 ms138596 KiB
#include "shoes.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define em emplace

const int maxn = 1e5 + 5;

int n;
queue<int> qu[maxn][2];
int pa[2*maxn];
int ord[maxn], cnt;
int fw[2*maxn];
ll res;

void upd(int i, int val){
	++i;
	for(;i<=n;i+=i&-i) fw[i] += val;
}

int query(int i){
	++i;
	int sum = 0;
	for(;i>0;i-=i&-i) sum += fw[i];
	return sum;
}

ll count_swaps(vector<int> s) {
	n = s.size();
	for(int i=0;i<n;++i){
	 	int ss = abs(s[i]);
	 	bool c = s[i] > 0;
		if(!qu[ss][!c].empty()){
			int l = qu[ss][!c].front();
			qu[ss][!c].pop();
			pa[l] = i;
		}
		else{
			qu[ss][c].em(i);
			ord[cnt++] = i;
		}
		upd(i, i);
		upd(i+1, -i);
	}
	for(int i=0;i<cnt;++i){
		int rr = query(pa[ord[i]]);
		if(s[ord[i]] > s[pa[ord[i]]]) ++res;
		res += (rr - i*2 - 1);
		upd(ord[i]+1, 1);
		upd(pa[ord[i]], -1);
	}
	return res;
}
#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...