제출 #499920

#제출 시각아이디문제언어결과실행 시간메모리
499920gozonitePairs (IOI07_pairs)C++14
100 / 100
1094 ms9184 KiB
#include <iostream> #include <vector> #include <string> #include <fstream> #include <algorithm> #include <climits> #include <cstdlib> #include <cstdio> #include <set> #include <unordered_set> #include <map> #include <unordered_map> #include <bitset> #include <deque> #include <queue> #include <tuple> #include <cmath> #include <cctype> #include <stack> #include <cassert> using namespace std; using ll = long long; struct vert { int x, y, t; }; bool cmp(const vert& a, const vert& b) { if (a.x != b.x) return a.x < b.x; return a.t < b.t; } int B, N, D, M; int inp[3][100001]; // B = 2 vert verts[200001]; int bit1[150002]={}; void addv(int k, int v) { for(; k <= 150000; k += k&-k) bit1[k] += v; } int sumr(int k) { int s = 0; for (; k >= 1; k -= k&-k) s += bit1[k]; return s; } // B = 3 int bit2[76][151][151]={}; void addv(int x, int y, int z, int v) { for (int i = x; i <= 150; i += i&-i) for (int j = y; j <= 150; j += j&-j) bit2[z][i][j] += v; } int sumr(int x, int y, int z) { int s = 0; for (int i = x; i >= 1; i -= i&-i) for (int j = y; j >= 1; j -= j&-j) s += bit2[z][i][j]; return s; } int sumr(int fx, int fy, int sx, int sy, int z) { return sumr(sx, sy, z) - sumr(sx, fy-1, z) - sumr(fx-1, sy, z) + sumr(fx-1, fy-1, z); } int main() { cin >> B >> N >> D >> M; if (B==1) { for (int i = 1; i <= N; i++) cin >> inp[0][i]; sort(inp[0]+1, inp[0]+1+N); int idx = 1; ll cnt = 0; for (int i = 1; i <= N; i++) { while (idx < N && inp[0][i]+D >= inp[0][idx+1]) idx++; cnt += (idx-i); } cout << cnt << endl; } else if (B==2) { for (int i = 1; i <= N; i++) cin >> inp[0][i] >> inp[1][i]; for (int i = 1; i <= N; i++) { verts[2*i-1] = {inp[0][i]-inp[1][i], inp[0][i]+inp[1][i], 0}; verts[2*i] = {inp[0][i]-inp[1][i]+D, inp[0][i]+inp[1][i], 1}; } sort(verts+1, verts+1+2*N, cmp); ll ans = 0; for (int i = 1; i <= 2*N; i++) { int y = verts[i].y; if (verts[i].t == 0) { int fy = max(2, y-D), sy = min(2*M, y+D); ans += sumr(sy)-sumr(fy-1); addv(y, 1); } else { addv(y, -1); } } cout << ans << endl; } else if (B==3) { for (int i = 1; i <= N; i++) cin >> inp[0][i] >> inp[1][i] >> inp[2][i]; ll ans = 0; for (int i = 1; i <= N; i++) { int x = inp[0][i], y = inp[1][i], z = inp[2][i]; for (int h = 1; h <= M; h++) { if (abs(h-z) > D) continue; int d = D-abs(h-z); int fx = max(1, x-y+75-d), sx = min(150, x-y+75+d); int fy = max(1, x+y-d), sy = min(150, x+y+d); ans += sumr(fx, fy, sx, sy, h); } addv(x-y+75, x+y, z, 1); } cout << ans << endl; } return 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...