답안 #456479

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
456479 2021-08-06T22:01:50 Z dutch Pairs (IOI07_pairs) C++17
85 / 100
416 ms 41916 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int LIM = 1e5+1, B = 250;

int b, n, d, ans, x[LIM], y[LIM], z[LIM], F[LIM*2];

int s[80][B][B];

void add(int i, int v){
	for(; i<=LIM*2; i+=i&-i) F[i] += v;
}

int get(int i){
	int v = 0;
	for(; i>=1; i-=i&-i) v += F[i];
	return v;
}

signed main(){
	cin.tie(0)->sync_with_stdio(0);
	cin >> b >> n >> d >> x[0];
	if(b == 1){
		for(int i=0; i<n; ++i)
			cin >> x[i];
		sort(x, x+n);
		for(int i=0, j=0; i<n; ++i){
			while(j < n && x[j]-x[i]<=d) ++j;
			ans += j-i;
		}
	}
	if(b == 2){
		array<int, 2> a[n];
		for(int i=0; i<n; ++i){
			cin >> x[i] >> y[i];
			a[i][1] = x[i] + y[i] + LIM;
			a[i][0] = x[i] - y[i] + LIM;
		}
		
		sort(a, a+n);
		for(int i=0; i<n; ++i){
			x[i] = a[i][1];
			y[i] = a[i][0];
		}

		int l = 0, r = 0;
		for(int i=0; i<n; ++i){
			while(r < n && y[r]-y[i] <= d)
				add(x[r++], 1);
			while(y[i]-y[l] > d)
				add(x[l++], -1);
			ans += get(x[i]+d) - get(x[i]-d-1);
		}
	}
	if(b == 3){
		for(int i=0; i<n; ++i){
			cin >> x[n] >> y[n] >> z[i];
			x[i] = x[n] + y[n] + 80;
			y[i] = x[n] - y[n] + 80;
			++s[z[i]][x[i]][y[i]];
		}

		for(int i=0; i<80; ++i)
			for(int j=1; j<B; ++j)
				for(int k=1; k<B; ++k)
					s[i][j][k] += s[i][j-1][k] + s[i][j][k-1] - s[i][j-1][k-1];
		
		for(int i=0; i<n; ++i){
			int fLim = min(z[i]+d, 75LL), diff;
			for(int f=max(z[i]-d, 0LL); f<=fLim; ++f){
				diff = abs(z[i] - f);
				int a1 = max(x[i] - d + diff - 1, 0LL);
				int a2 = min(x[i] + d - diff, 249LL);
				int b1 = max(y[i] - d + diff - 1, 0LL);
				int b2 = min(y[i] + d - diff, 249LL);
				ans += s[f][a2][b2] - s[f][a1][b2] - s[f][a2][b1] + s[f][a1][b1];
			}
		}
	}
	cout << (ans - n) / (1LL + (b > 1));
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 1052 KB Output is correct
2 Correct 18 ms 1100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 1100 KB Output is correct
2 Correct 24 ms 1100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 24 ms 1100 KB Output is correct
2 Correct 21 ms 1032 KB Output is correct
3 Correct 20 ms 1100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 972 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 3340 KB Output is correct
2 Correct 35 ms 3396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 3440 KB Output is correct
2 Correct 42 ms 3404 KB Output is correct
3 Correct 46 ms 3348 KB Output is correct
4 Correct 44 ms 3432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 45 ms 4188 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 39420 KB Output is correct
2 Correct 34 ms 39428 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 41688 KB Output is correct
2 Correct 67 ms 41724 KB Output is correct
3 Correct 79 ms 41784 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 41916 KB Output is correct
2 Correct 372 ms 41828 KB Output is correct
3 Correct 226 ms 41784 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 271 ms 41784 KB Output is correct
2 Correct 416 ms 41784 KB Output is correct
3 Correct 281 ms 41792 KB Output is correct