| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 184008 | Ruxandra985 | Arranging Shoes (IOI19_shoes) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "shoes.h"
#define DIMN 100010
using namespace std;
int aib[DIMN] , f[DIMN];
deque <int> poz[DIMN];
map <int,int> code;
void update (int i , int n , int x){
for (;i<=n;i = i + (i & (-i)))
aib[i]+=x;
}
int query (int i){
int sol = 0;
for (;i;i = i - (i & (-i)))
sol+=aib[i];
return sol;
}
long long count_swaps (int v[]){
int n , i , p1 , p2;
long long sol=0;
n = 0;
while (v[n])
n++;
n = n/2;
for (i=0;i<2*n;i++){
if (!code[max(v[i] , -v[i])])
code[max(v[i] , -v[i])] = i + 1;
}
for (i=0;i<2*n;i++){
poz[code[max(v[i] , -v[i])]].push_back(i); /// a doua pozitie
}
for (i=0;i<2*n;i++){
if (!f[i]){ /// nu ai mai intalnit
p1 = i + query(i + 1);
p2 = poz[code[max(v[i] , -v[i])]].front();
poz[code[max(v[i] , -v[i])]].pop_front();
while (p2 <= i){
p2 = poz[code[max(v[i] , -v[i])]].front();
poz[code[max(v[i] , -v[i])]].pop_front();
}
f[p2] = 1;
p2 += query(p2 + 1);
sol = sol + (p2 - p1 - 1);
if (v[i] > 0)
sol++; /// mai faci un swap
update (i + 1, 2*n , 1);
update (poz[code[max(v[i] , -v[i])]].front()+1 , 2*n , -1);
}
}
return sol;
}
