Submission #287227

# Submission time Handle Problem Language Result Execution time Memory
287227 2020-08-31T14:01:29 Z stoyan_malinin Ideal city (IOI12_city) C++14
0 / 100
1000 ms 3064 KB
//#include "grader.cpp"

#include <set>
#include <map>
#include <queue>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int mod = 1e9;

struct Point
{
    long long x, y;

    Point(){}
    Point(long long x, long long y)
    {
        this->x = x;
        this->y = y;
    }
};

int n;
vector <Point> v;

void init()
{
    int ind = 0;
    set <int> s;
    map <int, int> code;

    for(Point p: v) s.insert(p.x);
    for(int x: s) code[x] = ind, ind++;
    for(Point &p: v) p.x = code[p.x];

    //-----------------------

    ind = 0;
    s.clear();
    code.clear();

    for(Point p: v) s.insert(p.y);
    for(int y: s) code[y] = ind, ind++;
    for(Point &p: v) p.y  = code[p.y];
}

namespace Subtask2
{
    const vector <pair <int, int>> jumps = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    const int MAXN = 2005;

    bool exists[MAXN][MAXN];
    int dist[MAXN][MAXN];

    void bfs(Point p)
    {
        queue <Point> q;
        for(Point p: v) dist[p.x][p.y] = -1;

        q.push(p);
        dist[p.x][p.y] = 0;

        while(q.empty()==false)
        {
            p = q.front();
            q.pop();

            for(pair <int, int> j: jumps)
            {
                if(p.x+j.first>=0 && p.y+j.second>=0
                   && dist[p.x+j.first][p.y+j.second]==-1
                   && exists[p.x+j.first][p.y+j.second]==true)
                {
                    q.push(Point(p.x+j.first, p.y+j.second));
                    dist[p.x+j.first][p.y+j.second] = dist[p.x][p.y] + 1;
                }
            }
        }
    }

    long long solve()
    {
        for(Point p: v) exists[p.x][p.y] = true;

        long long answer = 0;
        for(Point p: v)
        {
            bfs(p);
            for(Point other: v) answer = (answer + dist[other.x][other.y])%mod;
        }

        return answer;
    }
};

int DistanceSum(int N, int *X, int *Y)
{
    n = N;
    for(int i = 0;i<n;i++) v.push_back(Point(X[i], Y[i]));

    //init();
    if(n<=2000) return Subtask2::solve();
}

Compilation message

city.cpp: In function 'int DistanceSum(int, int*, int*)':
city.cpp:107:1: warning: control reaches end of non-void function [-Wreturn-type]
  107 | }
      | ^
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 35 ms 760 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 1087 ms 2808 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 1086 ms 3064 KB Time limit exceeded
2 Halted 0 ms 0 KB -