이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "shoes.h"
#include <bits/stdc++.h>
#define FOR(i,p,k) for(int i=(p);i<=(k);++i)
#define REP(i,n) FOR(i,0,(n)-1)
#define ssize(x) (int((x).size()))
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long ll;
struct przedzialowiec{
int N;
vector<int> t;
przedzialowiec(int n){
for(N = 1; N < n;) N <<= 1;
t.resize(N<<1, 0);
}
void dodaj(int poz, int wart){
for(poz += N; poz; poz >>= 1) t[poz] += wart;
}
int suma(int p, int k){
int ret = 0;
for(p+=N, k+=N+1; p<k; p>>=1, k>>=1){
if(p&1) ret += t[p++];
if(k&1) ret += t[--k];
}
return ret;
}
};
ll count_swaps(vector<int> wej){
int n = ssize(wej)>>1;
unordered_map<int, set<int>> mapa;
REP(i, 2*n) mapa[wej[i]].emplace(i);
ll wyn = 0ll;
set<int> istnieje;
przedzialowiec prz(n<<1);
REP(i, n<<1) prz.dodaj(i, 1), istnieje.emplace(i);
while(ssize(istnieje)){
int t = *istnieje.begin();
int wart = wej[t];
int poz = *mapa[-wart].begin();
wyn += prz.suma(0, poz-1);
if(wart < 0) --wyn;
prz.dodaj(t, -1);
prz.dodaj(poz, -1);
mapa[wart].erase(t);
mapa[-wart].erase(poz);
istnieje.erase(t);
istnieje.erase(poz);
}
return wyn;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |