Submission #522000

#TimeUsernameProblemLanguageResultExecution timeMemory
522000emanuelsilvaPairs (IOI07_pairs)C++17
100 / 100
414 ms122328 KiB
#include <bits/stdc++.h> using namespace std; #define _ ios_base::sync_with_stdio(0);cin.tie(0); #define endl '\n' typedef long long ll; const int INF = 0x3f3f3f3f; const ll LINF = 0x3f3f3f3f3f3f3f3fll; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; template <class T> using ord_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; const int MAX = 4*76; const int SHIFT = 76; struct bit { int n; vector<int> b; bit() {} bit(int n_) : n(n_) { b.resize(n_+1); } void poe(int x, int val) { for (; x <= n; x += x & -x) b[x] += val; } int pref(int x) { if (x <= 0) return 0; int ret = 0; for (; x; x -= x & -x) ret += b[x]; return ret; } int query(int x0, int x1) { return pref(x1) - pref(x0-1); } }; struct bit2d { int n; vector<bit> b; bit2d() {} bit2d(int n_) : n(n_) { b.resize(n_+1, n_+1); } void poe(int x, int y, int val) { for (; x <= n; x += x & -x) b[x].poe(y, val); } int pref(int x, int y) { if (x <= 0 or y <= 0) return 0; int ret = 0; for (; x; x -= x & -x) ret += b[x].pref(y); return ret; } int query(int x0, int y0, int x1, int y1) { return pref(x1, y1) - pref(x1, y0-1) - pref(x0-1, y1) + pref(x0-1, y0-1); } }; struct bit3d { int n; vector<bit2d> b; bit3d() {} bit3d(int n_) : n(n_) { b.resize(n_+1, n_+1); } void poe(int x, int y, int z, int val) { for (; x <= n; x += x & -x) b[x].poe(y, z, val); } int pref(int x, int y, int z) { if (x <= 0 or y <= 0 or z <= 0) return 0; x = min(x, n), y = min(y, n), z = min(z, n); int ret = 0; for (; x; x -= x & -x) ret += b[x].pref(y, z); return ret; } int query(int x0, int y0, int z0, int x1, int y1, int z1) { return pref(x1, y1, z1) - pref(x1, y1, z0-1) - pref(x1, y0-1, z1) - pref(x0-1, y1, z1) + pref(x1, y0-1, z0-1) + pref(x0-1, y1, z0-1) + pref(x0-1, y0-1, z1) - pref(x0-1, y0-1, z0-1); } }; void solve1(int n, int d, int m) { vector<pair<int, int>> ev; for (int i = 0; i<n; i++) { int x; cin >> x; ev.emplace_back(x, 0); ev.emplace_back(x+d, 1); } sort(ev.begin(), ev.end()); int cnt = 0; ll ans = 0; for (auto [x, ty] : ev) { if (ty == 0) ans += cnt, cnt++; else cnt--; } cout << ans << endl; } void solve2(int n, int d, int m) { vector<tuple<int, int, int, int>> ev; for (int i = 0; i<n; i++) { int x, y; cin >> x >> y; int nx = x + y; y = x - y; x = nx; ev.emplace_back(x, 0, y, i); ev.emplace_back(x+d, 1, y, i); } sort(ev.begin(), ev.end()); ord_set<pair<int, int>> st; ll ans = 0; for (auto [x, ty, y, i] : ev) { if (ty == 0) { ans += st.order_of_key({y+d, INF}) - st.order_of_key({y-d, -INF}); st.insert({y, i}); } else st.erase({y, i}); } cout << ans << endl; } void solve3(int n, int d, int m) { vector<tuple<int, int, int, int, int>> ev; // w ty x y z for (int i = 0; i<n; i++) { int x, y, z; cin >> x >> y >> z; int nx = x + y + z + SHIFT; int ny = x + y - z + SHIFT; int nz = x - y + z + SHIFT; int nw = x - y - z; ev.emplace_back(nw, 0, nx, ny, nz); ev.emplace_back(nw+d, 1, nx, ny, nz); } sort(ev.begin(), ev.end()); ll ans = 0; bit3d b(MAX); for (auto [w, ty, x, y, z] : ev) { if (ty == 0) { ans += b.query(x-d, y-d, z-d, x+d, y+d, z+d); b.poe(x, y, z, +1); } else b.poe(x, y, z, -1); } cout << ans << endl; } int main() { _ int b, n, d, m; cin >> b >> n >> d >> m; if (b == 1) solve1(n, d, m); if (b == 2) solve2(n, d, m); if (b == 3) solve3(n, d, m); exit(0); }
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...