Submission #1000347

#TimeUsernameProblemLanguageResultExecution timeMemory
1000347bachhoangxuanIdeal city (IOI12_city)C++17
100 / 100
62 ms14580 KiB
#include<bits/stdc++.h>
using namespace std;
using i32 = int;
#define int long long
#define pii pair<int,int>
#define piii pair<pii,int>
#define fi first
#define se second
const int maxn = 1e5+5;
const int mod = 1e9;

int sx,sy;
vector<int> cx,cy;

vector<int> pos[maxn];
int sum[maxn],cnt[maxn],ls[maxn],lc[maxn],rs[maxn],rc[maxn];
int nsum[maxn],ncnt[maxn];

i32 DistanceSum(i32 N, i32 *X, i32 *Y) {
    for(int i=0;i<N;i++){
        cx.push_back(X[i]);
        cy.push_back(Y[i]);
    }
    sort(cx.begin(),cx.end());
    sort(cy.begin(),cy.end());
    cx.erase(unique(cx.begin(),cx.end()),cx.end());
    cy.erase(unique(cy.begin(),cy.end()),cy.end());
    sx=(int)cx.size();sy=(int)cy.size();
    for(int i=0;i<N;i++){
        X[i]=lower_bound(cx.begin(),cx.end(),X[i])-cx.begin()+1;
        Y[i]=lower_bound(cy.begin(),cy.end(),Y[i])-cy.begin()+1;
    }
    auto cal = [&](){
        vector<piii> pre;
        for(int t=1;t<=sx;t++) pos[t].clear();
        for(int i=0;i<N;i++) pos[X[i]].push_back(Y[i]);
        int cnt=0;
        vector<int> val;
        vector<vector<int>> edge;
        for(int t=1;t<=sx;t++){
            sort(pos[t].begin(),pos[t].end());
            vector<piii> cur;
            for(int y:pos[t]){
                if(cur.empty() || cur.back().fi.se+1<y){
                    cur.push_back({{y,y},cnt++});
                    edge.push_back({});val.push_back(1);
                }
                else cur.back().fi.se++,val[cur.back().se]++;
            }
            int p=0;
            for(auto [x,u]:cur){
                auto [l,r]=x;
                //cout << t << ' ' << l << ' ' << r << ' ' << u << '\n';
                auto add = [&](int lt,int rt){
                    int L=max(l,lt),R=min(r,rt);
                    return (L<=R);
                };
                while(p<(int)pre.size() && pre[p].fi.se<=r){
                    auto [xt,v]=pre[p++];
                    if(add(xt.fi,xt.se)){
                        edge[u].push_back(v);
                        edge[v].push_back(u);
                        //cout << "edge " << u << ' ' << v << '\n';
                    }
                }
                if(p<(int)pre.size() && add(pre[p].fi.fi,pre[p].fi.se)){
                    edge[u].push_back(pre[p].se);
                    edge[pre[p].se].push_back(u);
                    //cout << "edge " << u << ' ' << pre[p].se << '\n';
                }
            }
            pre=cur;
        }
        int res=0;
        function<void(int,int)> dfs = [&](int u,int p){
            for(int v:edge[u]){
                if(v!=p) dfs(v,u),val[u]+=val[v];
            }
            res=(res+val[u]*(N-val[u]))%mod;
        };
        dfs(0,-1);
        //cout << '\n';
        return res;
    };
    int total=cal();
    swap(sx,sy);
    for(int i=0;i<N;i++) swap(X[i],Y[i]);
    total=(total+cal())%mod;
    return total;
}
#undef int
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...