Submission #1208924

#TimeUsernameProblemLanguageResultExecution timeMemory
1208924HappyCapybaraIdeal city (IOI12_city)C++20
100 / 100
100 ms15616 KiB
#include<bits/stdc++.h>
using namespace std;

#define ll long long

int n;

ll res;

void dfs(int cur, vector<vector<int>>& g, vector<int>& st, vector<int>& s){
    st[cur] = s[cur];
    for (int next : g[cur]){
        if (st[next] != -1) continue;
        dfs(next, g, st, s);
        st[cur] += st[next];
        res += (ll)(n-st[next])*(ll)st[next];
    }
}

ll solve(map<int,vector<int>>& m){
    int cur = -1;
    vector<int> s;
    vector<vector<int>> g;
    map<pair<int,int>,int> cc;
    for (auto [x, v] : m){
        sort(v.begin(), v.end());
        for (int i=0; i<v.size(); i++){
            if (i == 0 || v[i] != v[i-1]+1){
                cur++;
                s.push_back(0);
                g.push_back({});
            }
            cc[{x, v[i]}] = cur;
            s.back()++;
            if (x != m.begin()->first){
                if (cc.find({x-1, v[i]}) != cc.end() && (g[cur].empty() || cc[{x-1, v[i]}] != g[cur].back())){
                    g[cur].push_back(cc[{x-1, v[i]}]);
                    g[cc[{x-1, v[i]}]].push_back(cur);
                }
            }
        }
    }
    vector<int> st(cur+1, -1);
    res = 0;
    dfs(0, g, st, s);
    return res;
}

int DistanceSum(int N, int *X, int *Y){
  n = N;
  map<int,vector<int>> rows, cols;
  for (int i=0; i<N; i++){
    rows[X[i]].push_back(Y[i]);
    cols[Y[i]].push_back(X[i]);
  }
  return (solve(rows)+solve(cols)) % 1000000000;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...