답안 #262759

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
262759 2020-08-13T08:30:00 Z 임성재(#5086) Pairs (IOI07_pairs) C++17
46 / 100
841 ms 29920 KB
#include<bits/stdc++.h>
using namespace std;

#define fast ios::sync_with_stdio(false); cin.tie(0);
#define pre(a) cout << fixed; cout.precision(a);
#define fi first
#define se second
#define em emplace
#define eb emplace_back
#define all(v) (v).begin() (v).end()
#define mp make_pair
#define mt make_tuple

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const ll INF = 1e18;
const int inf = 1e9;

struct point {
	ll x[3];
	point() {
		x[0] = x[1] = x[2] = 0;
	}

	bool operator<(point &p) {
		return mt(x[0], x[1], x[2]) < mt(p.x[0], p.x[1], p.x[2]);
	}
};

ll b, n, d, m;
point p[100010];
int cnt[80][80][80];
ll dp[230][80][80][80];
int dp2[230][80][80][80];
int dp3[230][80][80][80];
int tot[80][80][80];

ll dist(int i, int j) {
	ll ret = 0;
	for(int k=0; k<3; k++) {
		ret += abs(p[i].x[k] - p[j].x[k]);
	}

	return ret;
}

int main() {
	fast;

	cin >> b >> n >> d >> m;

	for(int i=1; i<=n; i++) {
		for(int j=0; j<b; j++) {
			cin >> p[i].x[j];
		}

		cnt[p[i].x[0]][p[i].x[1]][p[i].x[2]]++;
	}

	if(b == 1) {
		sort(p+1, p+n+1);

		ll ans = 0;
		int idx = 1;
		for(int i=1; i<=n; i++) {
			while(idx <= n && dist(idx, i) <= d) idx++;

			ans += idx - i - 1;
		}

		cout << ans;

		return 0;
	}
	if(b == 2) {
		sort(p+1, p+n+1);

		for(int i=1; i<=n; i++) {
			int x = p[i].x[0];
			int y = p[i].x[2];
		}
	}
	if(b == 3) {		
		for(int i=0; i<=min(d, 3*m-3); i++) {
			for(int j=1; j<=m; j++) {
				for(int k=1; k<=m; k++) {
					for(int l=1; l<=m; l++) {
						if(i == 0) {
							dp[0][j][k][l] = cnt[j][k][l];
							continue;
						}

						dp[i%3][j][k][l] = dp[(i+2)%3][j+1][k][l];
						dp[i%3][j][k][l] += dp[(i+2)%3][j-1][k][l];

						if(i > 1 && j > 1 && j < m) dp[i%3][j][k][l] -= dp[(i+1)%3][j][k][l];
						if(i == 2) dp[i%3][j][k][l] -= cnt[j][k][l];
					}
				}
			}

			for(int j=1; j<=m; j++) {
				for(int k=1; k<=m; k++) {
					for(int l=1; l<=m; l++) {
						dp2[i%3][j][k][l] = dp[i%3][j][k][l];
						if(i == 0) continue;
						dp2[i%3][j][k][l] += dp2[(i+2)%3][j][k-1][l];
						dp2[i%3][j][k][l] += dp2[(i+2)%3][j][k+1][l];

						if(i > 1 && k > 1 && k < m) dp2[i%3][j][k][l] -= dp2[(i+1)%3][j][k][l];
						if(i > 1) dp2[i%3][j][k][l] -= dp[(i+1)%3][j][k][l];
					}
				}
			}
		
			for(int j=1; j<=m; j++) {
				for(int k=1; k<=m; k++) {
					for(int l=1; l<=m; l++) {
						dp3[i%3][j][k][l] = dp2[i%3][j][k][l];
						if(i == 0) continue;
						dp3[i%3][j][k][l] += dp3[(i+2)%3][j][k][l-1];
						dp3[i%3][j][k][l] += dp3[(i+2)%3][j][k][l+1];
						
						if(i > 1 && l > 1 && l < m) dp3[i%3][j][k][l] -= dp3[(i+1)%3][j][k][l];
						if(i > 1) dp3[i%3][j][k][l] -= dp2[(i+1)%3][j][k][l];

						tot[j][k][l] += dp3[i%3][j][k][l];
					}
				}
			}
		}

		ll ans = 0;
		for(int i=1; i<=m; i++) {
			for(int j=1; j<=m; j++) {
				for(int k=1; k<=m; k++) {
					ans += (tot[i][j][k] + cnt[i][j][k] - 1) * cnt[i][j][k];
				}
			}
		}
		cout << ans / 2;
		return 0;
	}

}

Compilation message

pairs.cpp: In function 'int main()':
pairs.cpp:80:8: warning: unused variable 'x' [-Wunused-variable]
   80 |    int x = p[i].x[0];
      |        ^
pairs.cpp:81:8: warning: unused variable 'y' [-Wunused-variable]
   81 |    int y = p[i].x[2];
      |        ^
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 2816 KB Output is correct
2 Correct 2 ms 2816 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 84 ms 2688 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Runtime error 85 ms 2688 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 87 ms 2688 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 82 ms 2688 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 81 ms 2688 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 84 ms 4992 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 88 ms 2816 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 86 ms 2816 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 121 ms 28792 KB Output is correct
2 Correct 841 ms 28920 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 21 ms 3456 KB Output is correct
2 Correct 22 ms 3620 KB Output is correct
3 Correct 22 ms 3576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 57 ms 22136 KB Output is correct
2 Correct 145 ms 22136 KB Output is correct
3 Correct 366 ms 22136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 162 ms 29816 KB Output is correct
2 Correct 320 ms 29908 KB Output is correct
3 Correct 693 ms 29920 KB Output is correct