제출 #306033

#제출 시각아이디문제언어결과실행 시간메모리
306033talant117408Arranging Shoes (IOI19_shoes)C++17
100 / 100
259 ms18928 KiB
#include "shoes.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e5+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; } */ ll count_swaps(vector<int> s){ int n = s.size(), i; vector <pair <int, int>> order[N]; for(i = 0; i < n; i++){ order[abs(s[i])].emplace_back(make_pair(s[i], i+1)); } ll ans = 0; vector <pair<int, int>> qu; for(i = 1; i <= n/2; i++){ sort(order[abs(i)].begin(), order[abs(i)].end()); for(int j = 0; j < (int)order[i].size()/2; j++){ int l = order[i][j].second; int r = order[i][j+(int)order[i].size()/2].second; if(l > r){ swap(l, r); } else{ ans--; } qu.push_back(make_pair(l, r)); } } sort(qu.begin(), qu.end()); for(auto to : qu){ int l = to.first, r = to.second; ans += (r+get(1, 1, n, r, r))-(l+get(1, 1, n, l, l)); if(l+1 != r){ update(1, 1, n, l+1, r-1); } } 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...