답안 #1031279

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1031279 2024-07-22T16:41:04 Z VMaksimoski008 이상적인 도시 (IOI12_city) C++17
100 / 100
62 ms 9936 KB
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
using pii = pair<int, int>;
const int maxn = 1e5 + 5;
const int mod = 1e9;

vector<int> graph[maxn];
vector<ll> sub(maxn), sz(maxn);

void dfs(int u, int p) {
    sub[u] = sz[u];
    for(int &v : graph[u]) {
        if(v == p) continue;
        dfs(v, u);
        // cout << u << " -> " << v << '\n';
        sub[u] += sub[v];
    }
}

ll solve(vector<pii> v, int N, int *X, int *Y) {
    for(int i=0; i<maxn; i++) {
        graph[i].clear();
        sub[i] = sz[i] = 0;
    }

    int mn = 1e9, mx = 0;
    for(int i=0; i<N; i++) {
        mn = min(mn, v[i].first);
        mx = max(mx, v[i].first);
    }

    int curr = 1, total = 0;
    int p = 0, start = 0;

    vector<array<int, 3> > ivals;
    for(int i=mn; i<=mx; i++) {
        // cout << i << ": " << ivals.size() << '\n';
        start = p;
        int last = v[p].second-1;
        vector<array<int, 3> > nvals;
        int ptr = 0;
        while(p < N && v[p].first == i) {
            if(v[p].second - last > 1) {
                for(auto &[L, r, id] : ivals) {
                    if(min(r, v[p-1].second) - max(L, v[start].second) >= 0) {
                        graph[id].push_back(curr);
                        graph[curr].push_back(id);
                    }   
                }
                nvals.push_back({ v[start].second, v[p-1].second, curr });
                start = p;
                curr++;
            }
            sz[curr]++;
            last = v[p].second;
            p++;
        }

        if(start < p) {
            for(auto &[L, r, id] : ivals) {
                if(min(r, v[p-1].second) - max(L, v[start].second) >= 0) {
                    graph[id].push_back(curr);
                    graph[curr].push_back(id);
                }
            }
            nvals.push_back({ v[start].second, v[p-1].second, curr });
            start = p;
        }

        curr++;
        ivals = nvals;
    }

    curr--;
    dfs(1, 1);
    ll ans = 0;
    for(int i=2; i<=curr; i++) ans = (ans + sub[i] % mod * ((ll)N - sub[i]) % mod) % mod;
    return ans;
}

int DistanceSum(int N, int *X, int *Y) {
    if(N <= 2000) {
        vector<int> graph[N];
        for(int i=0; i<N; i++) {
            for(int j=i+1; j<N; j++) {
                if(abs(X[i] - X[j]) + abs(Y[i] - Y[j]) == 1) {
                    graph[i].push_back(j);
                    graph[j].push_back(i);
                }
            }
        }
 
        int ans = 0;
 
        for(int i=0; i<N; i++) {
            queue<int> q;
            vector<bool> vis(N);
            vector<int> dist(N);
            vis[i] = 1; q.push(i);
 
            while(!q.empty()) {
                int u = q.front(); q.pop();
                for(int &v : graph[u]) {
                    if(vis[v]) continue;
                    vis[v] = 1;
                    dist[v] = dist[u] + 1;
                    q.push(v);
                }
            }
 
            for(int j=i+1; j<N; j++) ans += dist[j];
        }
 
        return ans; 
    }

    vector<pii> v;
    for(int i=0; i<N; i++) v.push_back({ X[i], Y[i] });
    sort(v.begin(), v.end());

    ll ans = solve(v, N, X, Y);

    for(int i=0; i<N; i++) swap(v[i].first, v[i].second);
    sort(v.begin(), v.end());

    return (ans + solve(v, N, X, Y)) % mod;
}

Compilation message

city.cpp: In function 'll solve(std::vector<std::pair<int, int> >, int, int*, int*)':
city.cpp:42:13: warning: unused variable 'ptr' [-Wunused-variable]
   42 |         int ptr = 0;
      |             ^~~
city.cpp:33:19: warning: unused variable 'total' [-Wunused-variable]
   33 |     int curr = 1, total = 0;
      |                   ^~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4188 KB Output is correct
2 Correct 2 ms 4188 KB Output is correct
3 Correct 2 ms 4188 KB Output is correct
4 Correct 2 ms 4188 KB Output is correct
5 Correct 2 ms 4368 KB Output is correct
6 Correct 2 ms 4188 KB Output is correct
7 Correct 2 ms 4148 KB Output is correct
8 Correct 2 ms 4188 KB Output is correct
9 Correct 3 ms 4184 KB Output is correct
10 Correct 3 ms 4188 KB Output is correct
11 Correct 2 ms 4188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 4188 KB Output is correct
2 Correct 16 ms 4188 KB Output is correct
3 Correct 28 ms 4440 KB Output is correct
4 Correct 33 ms 4440 KB Output is correct
5 Correct 45 ms 4440 KB Output is correct
6 Correct 57 ms 4444 KB Output is correct
7 Correct 55 ms 4440 KB Output is correct
8 Correct 62 ms 4444 KB Output is correct
9 Correct 62 ms 4444 KB Output is correct
10 Correct 61 ms 4444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 5080 KB Output is correct
2 Correct 7 ms 5132 KB Output is correct
3 Correct 14 ms 6108 KB Output is correct
4 Correct 14 ms 6108 KB Output is correct
5 Correct 27 ms 7640 KB Output is correct
6 Correct 28 ms 7640 KB Output is correct
7 Correct 31 ms 7636 KB Output is correct
8 Correct 29 ms 7376 KB Output is correct
9 Correct 29 ms 7640 KB Output is correct
10 Correct 29 ms 9936 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 5336 KB Output is correct
2 Correct 8 ms 5288 KB Output is correct
3 Correct 21 ms 6612 KB Output is correct
4 Correct 21 ms 6484 KB Output is correct
5 Correct 40 ms 8920 KB Output is correct
6 Correct 32 ms 8156 KB Output is correct
7 Correct 39 ms 8912 KB Output is correct
8 Correct 31 ms 8144 KB Output is correct
9 Correct 31 ms 7888 KB Output is correct
10 Correct 30 ms 7760 KB Output is correct