제출 #519107

#제출 시각아이디문제언어결과실행 시간메모리
519107AdamGS이상적인 도시 (IOI12_city)C++17
100 / 100
70 ms9540 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define rep(a, b) for(int a = 0; a < (b); ++a)
#define st first
#define nd second
#define pb push_back
#define all(a) a.begin(), a.end()
const int LIM=1e5+7;
const ll MOD=1e9;
vector<int>V[LIM];
pair<int,int>T[LIM];
map<int,int>mp;
ll F[LIM], ile[LIM], n, ans;
int fnd(int x) {
	if(F[x]==x) return x;
	return F[x]=fnd(F[x]);
}
void uni(int a, int b) {
	if(fnd(a)==fnd(b)) return;
	ile[fnd(a)]+=ile[fnd(b)];
	F[fnd(b)]=fnd(a);
}
ll DFS(int x, int o) {
	ll s=ile[x];
	for(auto i : V[x]) if(i!=o) s+=DFS(i, x);
	ans+=s*(n-s);
	ans%=MOD;
	return s;
}
int DistanceSum(int N, int *X, int *Y) {
	n=N;
	rep(i, n) T[i]={X[i], Y[i]};
	rep(j, 2) {
		mp.clear();
		rep(i, n) {
			swap(T[i].st, T[i].nd);
			F[i]=i;
			ile[i]=1;
			V[i].clear();
		}
		sort(T, T+n);
		rep(i, n-1) {
			if(T[i].st==T[i+1].st && T[i].nd+1==T[i+1].nd) uni(i, i+1);
		}
		rep(i, n) {
			int x=mp[T[i].nd]-1;
			if(x>=0 && T[x].st==T[i].st-1 && (!V[fnd(i)].size() || V[fnd(i)].back()!=fnd(x))) {
				V[fnd(i)].pb(fnd(x));
				V[fnd(x)].pb(fnd(i));
			}
			mp[T[i].nd]=i+1;
		}
		DFS(fnd(0), fnd(0));
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...