Submission #396324

#TimeUsernameProblemLanguageResultExecution timeMemory
396324SortingPairs (IOI07_pairs)C++17
80 / 100
209 ms13228 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") using namespace std; typedef long long ll; constexpr int N = 1e5 + 3; constexpr int M[3] = {(int)(75e6 + 3), (int)(75e3 + 3), 75}; int b, n, d, m, t[M[2]][2 * M[2]][2 * M[2]]; vector<int> a[N]; ll ans = 0; struct Fenwick{ int a[2 * M[1]]; Fenwick(){} void update(int idx, int val){ for(; idx < 2 * M[1]; idx += idx&-idx) a[idx] += val; } int query(int idx){ int ret = 0; for(; idx >= 1; idx -= idx&-idx) ret += a[idx]; return ret; } int query(int l, int r){ return query(r) - query(l - 1); } } f; int get_cnt(int idx, int x1, int y1, int x2, int y2){ x1 = max(x1, 1), y1 = max(y1, 1); x2 = min(x2, 2 * M[2] - 1), y2 = min(y2, 2 * M[2] - 1); return t[idx][x2][y2] - t[idx][x2][y1 - 1] - t[idx][x1 - 1][y2] + t[idx][x1 - 1][y1 - 1]; } void solve_3(){ for(int i = 0; i < n; ++i){ int x = a[i][1], y = a[i][2]; a[i][1] = x - y + M[2]; a[i][2] = x + y; t[a[i][0]][a[i][1]][a[i][2]]++; } for(int i = 0; i < M[2]; ++i){ for(int j = 1; j < 2 * M[2]; ++j) for(int k = 1; k < 2 * M[2]; ++k) t[i][j][k] += t[i][j][k - 1] + t[i][j - 1][k] - t[i][j - 1][k - 1]; } for(int i = 0; i < n; ++i){ for(int dist = 0; dist <= d; ++dist){ int rem = d - dist; if(a[i][0] - dist >= 1) ans += get_cnt(a[i][0] - dist, a[i][1] - rem, a[i][2] - rem, a[i][1] + rem, a[i][2] + rem); if(!dist) continue; if(a[i][0] + dist <= m) ans += get_cnt(a[i][0] + dist, a[i][1] - rem, a[i][2] - rem, a[i][1] + rem, a[i][2] + rem); } --ans; } ans >>= 1; } void solve_2(){ for(int i = 0; i < n; ++i){ int x = a[i][0], y = a[i][1]; a[i][0] = x - y; a[i][1] = x + y; } sort(a, a + n); int l_ptr = 0, r_ptr = -1; for(int i = 0; i < n; ++i){ while(a[l_ptr][0] < a[i][0] - d){ f.update(a[l_ptr][1], -1); ++l_ptr; } while(r_ptr != n - 1 && a[r_ptr + 1][0] <= a[i][0] + d){ ++r_ptr; f.update(a[r_ptr][1], 1); } ans += f.query(max(a[i][1] - d, 1), min(a[i][1] + d, 2 * M[1] - 1)) - 1; } ans >>= 1; } void solve_1(){ sort(a, a + n); int j = 0; for(int i = 0; i < n; ++i){ while(j != n && a[j][0] <= a[i][0] + d) ++j; ans += j - i - 1; } } int main(){ ios::sync_with_stdio(false); cin.tie(NULL); cin >> b >> n >> d >> m; for(int i = 0; i < n; ++i){ a[i].resize(b); for(int j = 0; j < b; ++j) cin >> a[i][j]; } if(b == 1) solve_1(); else if(b == 2) solve_2(); else solve_3(); cout << ans << "\n"; }
#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...