이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+7;
ll tree[N*4], lz[N*4];
void push(int v, int l, int r){
if(l > r) return;
if(lz[v]){
tree[v] += ll(r-l+1)*lz[v];
if(l != r){
lz[v<<1] += lz[v];
lz[(v<<1)+1] += lz[v];
}
lz[v] = 0;
}
}
ll get(int v, int l, int r, int ql, int qr){
push(v, l, r);
if(l > qr || r < ql) return 0;
if(ql <= l && r <= qr) return tree[v];
int mid = (l+r)>>1;
return get(v<<1, l, mid, ql, qr)+get((v<<1)+1, mid+1, r, ql, qr);
}
void update(int v, int l, int r, int ql, int qr){
push(v, l, r);
if(l > qr || r < ql) return;
if(ql <= l && r <= qr){
tree[v] += ll(r-l+1);
if(l != r){
lz[v<<1]++;
lz[(v<<1)+1]++;
}
return;
}
int mid = (l+r)>>1;
update(v<<1, l, mid, ql, qr);
update((v<<1)+1, mid+1, r, ql, qr);
tree[v] = tree[v<<1]+tree[(v<<1)+1];
}
/*
ll count_swaps(vector <int> s);
int main() {
int n;
assert(1 == scanf("%d", &n));
vector<int> S(2 * n);
for (int i = 0; i < 2 * n; i++)
assert(1 == scanf("%d", &S[i]));
fclose(stdin);
long long result = count_swaps(S);
printf("%lld\n", result);
fclose(stdout);
return 0;
}
*/
vector <set <int>> pos(N*2);
ll count_swaps(vector<int> s){
int n = s.size(), i;
for(i = 0; i < n; i++){
if(s[i] > 0){
pos[s[i]].insert(i);
}
else{
pos[abs(s[i])+100003].insert(i);
}
}
ll ans = 0;
vector <int> used(n);
for(i = 0; i < n; i++){
if(used[i]) continue;
if(s[i] > 0){
int pos1 = i+get(1, 1, n, i+1, i+1)+1, pos2 = *(pos[s[i]+100003].upper_bound(i))+1;
used[pos2-1]++;
pos2 += get(1, 1, n, pos2, pos2);
ans += ll(pos2-pos1);
if(pos1+1 != pos2){
update(1, 1, n, pos1+1, pos2-1);
}
pos[s[i]+100003].erase(pos[s[i]+100003].upper_bound(i));
}
else{
ans--;
int pos1 = i+get(1, 1, n, i+1, i+1)+1, pos2 = *(pos[abs(s[i])].upper_bound(i))+1;
used[pos2-1]++;
pos2 += get(1, 1, n, pos2, pos2);
ans += ll(pos2-pos1);
if(pos1+1 != pos2){
update(1, 1, n, pos1+1, pos2-1);
}
pos[abs(s[i])].erase(pos[abs(s[i])].upper_bound(i));
}
}
return ans;
}
| # | 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... |