Submission #568195

#TimeUsernameProblemLanguageResultExecution timeMemory
568195benjaminkleynIdeal city (IOI12_city)C++17
100 / 100
59 ms6152 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int n;
pair<int,int> sq[100'000];

struct block
{
    int x, min_y, max_y;
    int sz() 
    {
        return max_y - min_y + 1;
    }
};

int m;
vector<block> blocks;
vector<vector<int>> neighbors;
vector<bool> vis;
ll res;

int dfs(int u)
{
    ll sz = blocks[u].sz();
    vis[u] = true;

    for (int v : neighbors[u])
        if (!vis[v])
            sz += dfs(v);

    res += sz * (n - sz) % 1'000'000'000;
    res %= 1'000'000'000;
    return sz;
}

void solve()
{
    sort(sq, sq + n);
    blocks.resize(0);
    int min_x = sq[0].first;
    int max_x = sq[n - 1].first;
    for (int i = 0; i < n; i++)
    {
        int min_y = sq[i].second;
        while (i < n && sq[i].first == sq[i + 1].first && sq[i].second + 1 == sq[i + 1].second)
            i++;
        
        blocks.push_back({sq[i].first, min_y, sq[i].second});
    }

    m = blocks.size();
    
    neighbors.assign(m, {});
    //int r = 1;
    for (int l = 0; l < m && sq[l].first < max_x; l++)
    {
        int r = l + 1;
        while (r < m && blocks[l].x == blocks[r].x) r++;

        for (; r < m && blocks[l].x + 1 == blocks[r].x; r++)
            if (!(blocks[r].max_y < blocks[l].min_y || blocks[l].max_y < blocks[r].min_y))
            {
                neighbors[r].push_back(l);
                neighbors[l].push_back(r);
            }
    }

    vis.assign(m, false);
    dfs(0);
}

int DistanceSum(int N, int *X, int *Y) 
{
    n = N;
    
    for (int i = 0; i < N; i++)
        sq[i].first = X[i], sq[i].second = Y[i];

    solve();

    for (int i = 0; i < N; i++)
        swap(sq[i].first, sq[i].second);

    solve();

    return (int) (res % 1'000'000'000);
}

/*
int nn;
int xx[100000], yy[100000];
int main()
{
    ifstream cin("example.txt");
    //ofstream fout("output.txt");
    cin >> nn;
    for (int i = 0; i < nn; i++)
        cin >> xx[i] >> yy[i];   
 
    fout << DistanceSum(nn, xx, yy) << '\n';
 
    return 0;
}
*/

Compilation message (stderr)

city.cpp: In function 'void solve()':
city.cpp:41:9: warning: unused variable 'min_x' [-Wunused-variable]
   41 |     int min_x = sq[0].first;
      |         ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...