이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
#define ll long long
#define mp make_pair
#define pub push_back
#define pob pop_back()
#define ss second
#define ff first
#define mt make_tuple
#define pof pop_front()
#define fbo find_by_order
#define ook order_of_key
#define lb lower_bound
#define ub upper_bound
#define inbuf_len 1 << 16
#define outbuf_len 1 << 16
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set;
using pll = pair <ll, ll>;
using pii = pair <int, int>;
ll cx[100001], cy[100001], mod = 1e9, dist[2001][2001], grd[2002][2002], h[4] = {0, 0, -1, 1}, v[4] = {-1, 1, 0, 0}, ans, used[2001];
int DistanceSum(int n, int *x, int *y) {
int mnx = INT_MAX, mny = INT_MAX;
for (int i = 0; i < n; i++)
{
mnx = min(mnx, x[i]);
mny = min(mny, y[i]);
}
for (int i = 0; i < n; i++)
{
x[i] -= mnx;
y[i] -= mny;
}
if ( n <= 2000 )
{
for (int i = 0; i < n; i++)
grd[x[i]][y[i]] = i + 1;
memset(dist, -1, sizeof dist);
for (int i = 0; i < n; i++)
{
queue<pii> q;
q.push(mp(x[i], y[i]));
dist[i + 1][i + 1] = 0;
memset(used, 0, sizeof used);
used[i + 1] = 1;
while (!q.empty())
{
int u = q.front().ff, ve = q.front().ss;
q.pop();
for (int j = 0; j < 4; j++)
{
if ( u + v[j] >= 0 && ve + h[j] >= 0 && grd[u + v[j]][ve + h[j]] && !used[grd[u + v[j]][ve + h[j]]] )
{
used[grd[u + v[j]][ve + h[j]]] = 1;
dist[i + 1][grd[u + v[j]][ve + h[j]]] = dist[i + 1][grd[u][ve]] + 1;
q.push(mp(u + v[j], ve + h[j]));
}
}
}
for (int j = i + 1; j < n; j++)
{
ans = (ans + dist[i + 1][j + 1]) % mod;
}
}
} else {
for (int i = 0; i < n; i++)
{
cx[x[i]]++;
cy[y[i]]++;
}
ll sx = 0, sy = 0, ssx = 0, ssy = 0;
for (int i = n; i >= 0; i--)
{
ans = (ans + ((ssx * cx[i]) % mod + (cy[i] * ssy) % mod) % mod) % mod;
sy = (sy + cy[i]) % mod;
sx = (sx + cx[i]) % mod;
ssx = (ssx + sx) % mod;
ssy = (ssy + sy) % mod;
}
}
return ans;
}
//
//int main() {
// int tmp;
//
// int N, i;
// scanf("%d", &N);
//
// int sq_x[100001], sq_y[100001];
// for (i = 0; i < N; i++) {
// tmp = scanf("%d %d", &sq_x[i], &sq_y[i]);
// }
//
// int ds = DistanceSum(N, sq_x, sq_y);
// printf("%d\n", ds);
//
// return 0;
//
//}
# | 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... |