제출 #158256

#제출 시각아이디문제언어결과실행 시간메모리
158256davitmarg이상적인 도시 (IOI12_city)C++17
55 / 100
158 ms6384 KiB
/*DavitMarg*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <iomanip>
#include <bitset>
#include <stack>
#include <cassert>
#include <iterator>
#include <fstream>
#define mod 1000000000ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
#define all(v) v.begin(), v.end()
using namespace std;

int x[100005], y[100005], used[100005], d[100005], n;
vector<int> g[100005];

LL ans;

void bfs(int v)
{
    for (int i = 1; i <= n; i++)
        used[i] = 0;
    queue<int> q;
    used[v] = 1;
    d[v] = 0;
    q.push(v);
    while (!q.empty())
    {
        int v = q.front();
        q.pop();
        ans += d[v];
        ans %= mod;
        for (int i = 0; i < g[v].size(); i++)
        {
            int to = g[v][i];
            if (used[to])
                continue;
            d[to] = d[v] + 1;
            used[to] = 1;
            q.push(to);
        }
    }
}

int DistanceSum(int N, int *X, int *Y)
{
    n = N;
    for (int i = 1; i <= n; i++)
    {
        x[i] = X[i - 1];
        y[i] = Y[i - 1];
    }
    if (n <= 2000)
    {
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (abs(x[i] - x[j]) + abs(y[i] - y[j]) == 1)
                    g[i].PB(j);
        for (int i = 1; i <= n; i++)
            bfs(i);
        ans /= 2;
    }
    else
    {
        vector<pair<int, int>> v;

        LL pr;

        pr = 0;
        v.clear();
        for (int i = 1; i <= n; i++)
            v.PB(MP(x[i], y[i]));
        sort(all(v));

        for (int i = 0; i < v.size(); i++)
        {
            if (i == 0 || v[i].first != v[i - 1].first)
                pr += i;
            //cout << pr << " : " << v[i].first << "\n";
            ans += pr;
            ans %= mod;
        }

        pr = 0;
        v.clear();
        for (int i = 1; i <= n; i++)
            v.PB(MP(y[i], x[i]));
        sort(all(v));

        for (int i = 0; i < v.size(); i++)
        {
            if (i == 0 || v[i].first != v[i - 1].first)
                pr += i;
            ans += pr;
            ans %= mod;
        }
    }

    return ans;
}

#ifdef death

int main()
{
    int N, X[102], Y[102];
    cin >> N;
    for (int i = 0; i < N; i++)
        cin >> X[i] >> Y[i];
    cout << DistanceSum(N, X, Y) << endl;
    return 0;
}

#endif

/*

4
1 1
1 2
1 3
2 3

  #
###

##
#
#

0 

*/

컴파일 시 표준 에러 (stderr) 메시지

city.cpp: In function 'void bfs(int)':
city.cpp:44:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < g[v].size(); i++)
                         ~~^~~~~~~~~~~~~
city.cpp: In function 'int DistanceSum(int, int*, int*)':
city.cpp:86:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < v.size(); i++)
                         ~~^~~~~~~~~~
city.cpp:101:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < v.size(); i++)
                         ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...