Submission #121889

#TimeUsernameProblemLanguageResultExecution timeMemory
121889TuGSGeReLIdeal city (IOI12_city)C++14
55 / 100
276 ms32456 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...