답안 #597479

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
597479 2022-07-16T05:48:04 Z Hanksburger 이상적인 도시 (IOI12_city) C++17
100 / 100
61 ms 10672 KB
#include <bits/stdc++.h>
using namespace std;
vector<pair<pair<int, int>, int> > b[100005];
vector<int> adj[100005], w;
vector<pair<int, int> > a;
long long ans;
int n;
long long dfs(int u, int p)
{
    long long sum=w[u];
    for (int v:adj[u])
    {
        if (v!=p)
        {
            long long x=dfs(v, u);
            ans=(ans+x*(n-x))%1000000000;
            sum+=x;
        }
    }
    return sum;
}
int DistanceSum(int N, int *X, int *Y)
{
    n=N;
    for (int z=0; z<2; z++)
    {
        int mn=2147483647, sz=0, cnt=0;
        for (int i=0; i<n; i++)
        {
            mn=min(mn, X[i]);
            sz=max(sz, X[i]);
        }
        sz-=mn;
        for (int i=0; i<n; i++)
            a.push_back({X[i]-mn, Y[i]});
        sort(a.begin(), a.end());
        for (int i=0; i<n; )
        {
            int ind=i+1;
            while (ind<n && a[i].first==a[ind].first && a[ind-1].second+1==a[ind].second)
                ind++;
            w.push_back(a[ind-1].second-a[i].second+1);
            b[a[i].first].push_back({{a[i].second, a[ind-1].second}, cnt++});
            i=ind;
        }
        for (int i=0; i<sz; i++)
        {
            int ind=0;
            for (int j=0; j<b[i].size(); j++)
            {
                while (ind<b[i+1].size() && b[i+1][ind].first.second<b[i][j].first.first)
                    ind++;
                while (ind<b[i+1].size() && b[i+1][ind].first.first<=b[i][j].first.second)
                {
                    int u=b[i][j].second, v=b[i+1][ind].second;
                    adj[u].push_back(v);
                    adj[v].push_back(u);
                    ind++;
                }
                ind=max(0, ind-1);
            }
        }
        dfs(0, 0);
        for (int i=0; i<n; i++)
            swap(X[i], Y[i]);
        a.clear();
        w.clear();
        for (int i=0; i<=sz; i++)
            b[i].clear();
        for (int i=0; i<cnt; i++)
            adj[i].clear();
    }
    return ans;
}

Compilation message

city.cpp: In function 'int DistanceSum(int, int*, int*)':
city.cpp:49:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |             for (int j=0; j<b[i].size(); j++)
      |                           ~^~~~~~~~~~~~
city.cpp:51:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |                 while (ind<b[i+1].size() && b[i+1][ind].first.second<b[i][j].first.first)
      |                        ~~~^~~~~~~~~~~~~~
city.cpp:53:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |                 while (ind<b[i+1].size() && b[i+1][ind].first.first<=b[i][j].first.second)
      |                        ~~~^~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 3 ms 5004 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 3 ms 5000 KB Output is correct
6 Correct 3 ms 4948 KB Output is correct
7 Correct 4 ms 4948 KB Output is correct
8 Correct 3 ms 4948 KB Output is correct
9 Correct 3 ms 5004 KB Output is correct
10 Correct 3 ms 4948 KB Output is correct
11 Correct 4 ms 4948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 3 ms 5076 KB Output is correct
4 Correct 3 ms 5076 KB Output is correct
5 Correct 3 ms 5076 KB Output is correct
6 Correct 3 ms 5076 KB Output is correct
7 Correct 4 ms 5076 KB Output is correct
8 Correct 4 ms 5076 KB Output is correct
9 Correct 3 ms 4948 KB Output is correct
10 Correct 3 ms 4948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 5588 KB Output is correct
2 Correct 10 ms 5588 KB Output is correct
3 Correct 26 ms 6104 KB Output is correct
4 Correct 26 ms 6104 KB Output is correct
5 Correct 44 ms 6996 KB Output is correct
6 Correct 38 ms 6904 KB Output is correct
7 Correct 38 ms 6996 KB Output is correct
8 Correct 41 ms 6892 KB Output is correct
9 Correct 44 ms 6988 KB Output is correct
10 Correct 48 ms 10672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 5992 KB Output is correct
2 Correct 11 ms 5924 KB Output is correct
3 Correct 27 ms 7468 KB Output is correct
4 Correct 25 ms 7004 KB Output is correct
5 Correct 50 ms 9856 KB Output is correct
6 Correct 42 ms 8476 KB Output is correct
7 Correct 61 ms 9768 KB Output is correct
8 Correct 53 ms 8480 KB Output is correct
9 Correct 43 ms 8008 KB Output is correct
10 Correct 51 ms 8040 KB Output is correct