제출 #274841

#제출 시각아이디문제언어결과실행 시간메모리
274841shayan_pIdeal city (IOI12_city)C++14
100 / 100
531 ms14824 KiB
// And you curse yourself for things you never done

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

const int maxn = 1e5 + 10;
const int Nine = (int)1e9;

vector<int> v[maxn];

int pr[maxn];

int fnd(int u){
    return pr[u] < 0 ? u : pr[u] = fnd(pr[u]);
}
bool mrg(int a, int b){
    if( (a = fnd(a)) == (b = fnd(b)) )
	return 0;
    if(pr[a] > pr[b])
	swap(a, b);
    pr[a]+= pr[b];
    pr[b] = a;
    return 1;
}
int SZ[maxn];
int dfs(int tot, int u, int par = -1){
    int ans = 0;
    SZ[u] = -pr[fnd(u)];
    for(int y : v[u]){
	if(y != par){
	    ans = (ans + dfs(tot, y, u)) % Nine;
	    SZ[u]+= SZ[y];
	}
    }
    ans = (1ll * ans + 1ll * SZ[u] * (tot - SZ[u])) % Nine;
    return ans;
}
void add_edge(int a, int b){
    v[a].PB(b);
    v[b].PB(a);
}
int solve(int n, int *X, int *Y){
    for(int i = 0; i < n; i++){
	v[i].clear();
    }
    
    memset(pr, -1, sizeof pr);
    
    map<pii, int> mp;
    for(int i = 0; i < n; i++)
	mp[{X[i], Y[i]}] = i;
    vector<int> vc;    
    for(int i = 0; i < n; i++){
	if(mp.count({X[i], Y[i]+1}))
	    mrg(i, mp[{X[i], Y[i]+1}]);	
    }
    for(int i = 0; i < n; i++){
	if(mp.count({X[i]+1, Y[i]}))
	    vc.PB(i);
    }
    sort(vc.begin(), vc.end(), [&](int i, int j){ return Y[i] < Y[j]; });
    for(int a : vc){
	int b = mp[{X[a]+1, Y[a]}];
	if(mp.count({X[a], Y[a]+1}) == 0 || mp.count({X[a]+1, Y[a]+1}) == 0)
	    add_edge(fnd(a), fnd(b));
    }
    return dfs(n, fnd(0));
}
int ITER = 0;
int DistanceSum(int n, int *X, int *Y){
    assert(++ITER <= 1);
    return (solve(n, X, Y) + solve(n, Y, X)) % Nine;
}
    
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...