이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <iostream>
#include <vector>
using namespace std;
#define oo 1000000000
#define ll long long
#define pb push_back
const int m = 1e9;
vector<int> getCnt(int n, int k, int* x, int* y){
vector<int> mn(k+1, oo), mx(k+1);
for (int i = 0; i < n; ++i) {
mn[x[i]] = min(mn[x[i]], y[i]);
mx[x[i]] = max(mx[x[i]], y[i]);
}
vector<int> cnt(k+1);
for (int i = 1; i <= k; ++i) {
if (mx[i] == 0) continue;
cnt[i] = mx[i] - mn[i] + 1;
}
return cnt;
}
int getDist(vector<int> v){
int n = v.size();
vector<int> s(n+1), si(n+1);
for (int i = n-1; i > 0; --i) {
s[i] = (s[i+1] + v[i]) * 1ll % m;
si[i] = (si[i+1] + s[i]) * 1ll % m;
}
int res = 0;
for (int i = 1; i < n; ++i) {
res += (v[i] * si[i+1]) * 1ll % m;
res %= m;
}
return res;
}
int DistanceSum(int n, int *x, int *y) {
int mn_x = oo, mn_y = oo;
for (int i = 0; i < n; ++i) {
mn_x = min(mn_x, x[i]);
mn_y = min(mn_y, y[i]);
}
int mx_x = 0, mx_y = 0;
for (int i = 0; i < n; ++i) {
x[i] = x[i] - mn_x + 1;
y[i] = y[i] - mn_y + 1;
mx_x = max(x[i], mx_x);
mx_y = max(y[i], mx_y);
}
vector<int> col = getCnt(n, mx_x, x, y);
vector<int> row = getCnt(n, mx_y, y, x);
int ans = getDist(col);
ans += getDist(row);
ans %= m;
return ans;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |