Submission #306008

#TimeUsernameProblemLanguageResultExecution timeMemory
306008talant117408Arranging Shoes (IOI19_shoes)C++17
10 / 100
109 ms44920 KiB
#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])+100001].insert(i); } } ll ans = 0; vector <int> used(n); for(i = 0; i < n; i++){ if(used[i]) continue; int pos1, pos2; if(s[i] > 0){ pos1 = i+1; pos2 = *(pos[s[i]+100001].upper_bound(i))+1; used[pos2-1]++; pos1 += get(1, 1, n, pos1, pos1); 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]+100001].erase(pos[s[i]+100001].upper_bound(i)); } else{ ans--; pos1 = i+1; pos2 = *(pos[abs(s[i])].upper_bound(i))+1; used[pos2-1]++; pos1 += get(1, 1, n, pos1, pos1); 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 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...