Submission #1214764

#TimeUsernameProblemLanguageResultExecution timeMemory
1214764LIAIdeal city (IOI12_city)C++17
0 / 100
6 ms1092 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef tuple<ll,ll,ll> plll;
typedef vector<plll> vplll;
typedef pair<ll,ll> pll;
typedef vector<ll> vll;
typedef vector<pll> vpll;
typedef vector<vpll> vvpll;
typedef vector<vll> vvll;
typedef vector<bool> vb;
typedef vector<vb> vvb;
#define loop(i,s,e) for(ll i=(s); i<(e); ++i)
#define loopr(i,e,s) for(ll i=(e)-1; i>=(s); --i)
#define all(a) a.begin(),a.end()
const ll inf = 1e9+7;

vvll g1, g2;
vll w1, w2;
vll sub1, sub2;
ll total1 = 0, total2 = 0, n, ans = 0;

ll dfs1(ll u, ll p) {
    ll s = w1[u];
    for (ll v : g1[u]) {
        if (v != p) {
            s += dfs1(v, u);
        }
    }
    sub1[u] = s;
    if (p != -1) {
        ans += s * (total1 - s);
    }
    return s;
}

ll dfs2(ll u, ll p) {
    ll s = w2[u];
    for (ll v : g2[u]) {
        if (v != p) {
            s += dfs2(v, u);
        }
    }
    sub2[u] = s;
    if (p != -1) {
        ans += s * (total2 - s);
    }
    return s;
}

int DistanceSum(int nn, int *x, int *y) {
    ans = 0;
    n = nn;
    vll xs;
    vll ys;
    xs.reserve(n);
    ys.reserve(n);
    loop(i,0,n) {
        xs.push_back(x[i]);
        ys.push_back(y[i]);
    }
    sort(all(xs));
    xs.erase(unique(all(xs)), xs.end());
    sort(all(ys));
    ys.erase(unique(all(ys)), ys.end());
    ll m1 = xs.size();
    ll m2 = ys.size();
    g1.assign(m1, vll());
    g2.assign(m2, vll());
    vll xid(n);
    vll yid(n);
    loop(i,0,n) {
        xid[i] = lower_bound(all(xs), x[i]) - xs.begin();
        yid[i] = lower_bound(all(ys), y[i]) - ys.begin();
    }
    loop(i,0,m1-1) {
        g1[i].push_back(i+1);
        g1[i+1].push_back(i);
    }
    loop(i,0,m2-1) {
        g2[i].push_back(i+1);
        g2[i+1].push_back(i);
    }
    w1.assign(m1, 0);
    w2.assign(m2, 0);
    loop(i,0,n) {
        w1[xid[i]]++;
        w2[yid[i]]++;
    }
    total1 = 0;
    loop(i,0,m1) {
        total1 += w1[i];
    }
    sub1.assign(m1, 0);
    if (m1 > 0) {
        dfs1(0, -1);
    }
    total2 = 0;
    loop(i,0,m2) {
        total2 += w2[i];
    }
    sub2.assign(m2, 0);
    if (m2 > 0) {
        dfs2(0, -1);
    }
    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...