Submission #1260640

#TimeUsernameProblemLanguageResultExecution timeMemory
1260640PlayVoltzIdeal city (IOI12_city)C++20
100 / 100
80 ms16180 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second

const int MOD = 1000000000;

int n, ans=0;
vector<int> sz;
vector<vector<int> > graph;

void dfs(int node, int p){
	for (auto num:graph[node])if (num!=p)dfs(num, node), sz[node]+=sz[num], ans=(ans+sz[num]*(n-sz[num]))%MOD;
}

void calc(map<int, vector<int> > ord){
	graph.clear();
	sz.clear();
	sz.resize(n+1, 0);
	graph.resize(n+1);
	int counter=0;
	map<int, int> prev, now;
	for (auto [c, vect]:ord){
		sort(vect.begin(), vect.end());
		for (int i=0; i<vect.size(); ++i){
			if (!i||vect[i]!=vect[i-1]+1)++counter;
			now[vect[i]]=counter;
			++sz[counter];
			if (prev[vect[i]])if (graph[counter].empty()||graph[counter].back()!=prev[vect[i]])graph[counter].pb(prev[vect[i]]), graph[prev[vect[i]]].pb(counter);
		}
		swap(prev, now);
		now.clear();
	}
	dfs(1, -1);
}

signed DistanceSum(signed N, signed *x, signed *y){
	n=N;
	map<int, vector<int> > a, b;
	for (int i=0; i<n; ++i)a[x[i]].pb(y[i]), b[y[i]].pb(x[i]);
	calc(a);
	calc(b);
	return (signed)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...