제출 #992018

#제출 시각아이디문제언어결과실행 시간메모리
992018coolboy19521Arranging Shoes (IOI19_shoes)C++17
100 / 100
526 ms149200 KiB
#include <bits/stdc++.h> #include "shoes.h" using namespace std; const int sz = 2e5 + 10; int st[sz * 4]; int query(int ql, int qr, int le, int ri, int v) { if (le > qr || ri < ql) return 0; if (ql <= le && ri <= qr) return st[v]; int mi = le + (ri - le) / 2; int ls = query(ql, qr, le, mi, v * 2); int rs = query(ql, qr, mi + 1, ri, v * 2 + 1); return ls + rs; } void update(int le, int ri, int k, int v) { if (le == k && ri == k) { st[v] = 1; } else if (le <= k && k <= ri) { int mi = le + (ri - le) / 2; update(le, mi, k, v * 2); update(mi + 1, ri, k, v * 2 + 1); // cout << "UPD RANGE: " << le << ' ' << ri << '\n'; st[v] = st[v * 2] + st[v * 2 + 1]; } } long long count_swaps(std::vector<int> s) { map<int,queue<int>>cl; int n = s.size(); for (int i = 0; i < n; i ++) { cl[s[i]].push(i); } long long r = 0; for (int i = 0; i < n; i ++) { auto it = query(i + 1, i + 1, 1, n, 1); if (it != 0) continue; int ix = cl[-s[i]].front(); int vs = i - query(1, i + 1, 1, n, 1); int ve = ix - query(1, ix + 1, 1, n, 1); // cout << vs << ' ' << ve << '\n'; r += (ve - vs); if (s[i] < 0) { r --; } cl[-s[i]].pop(); cl[s[i]].pop(); // cout << "IND " << i << ' ' << vs << '\n'; // update(i + 1, i + 1, 1, n, 1); update(1, n, i + 1, 1); // cout << "IND " << ix << ' ' << ve << '\n'; update(1, n, ix + 1, 1); // update(ix + 1, ix + 1, 1, n, 1); // cout << i << ' ' << ix << '\n'; // cout << "SUM OF ALL: " << query(1, n, 1, n, 1) << '\n'; } return r; }
#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...