제출 #272775

#제출 시각아이디문제언어결과실행 시간메모리
272775stoyan_malininAliens (IOI16_aliens)C++14
0 / 100
1 ms416 KiB
#include "aliens.h"
//#include "grader.cpp"

#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

const int MAXN = 505;

struct Point
{
    int r, c;

    Point(){}
    Point(int r, int c)
    {
        this->r = r;
        this->c = c;
    }
};

bool cmpCol(Point A, Point B)
{
    if(A.c!=B.c) return A.c<B.c;
    return A.r<B.r;
}

int n, m, k;
long long dp[MAXN][MAXN];

vector <Point> v;
int squareSz[MAXN][MAXN], leftestCover[MAXN];

void init()
{
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<=k;j++)
        {
            dp[i][j] = 6969696966969LL;
        }
    }

    for(int r = 0;r<v.size();r++)
    {
        int maxDist = -1;
        for(int l = r;l>=0;l--)
        {
            maxDist = max(maxDist, abs(v[l].c-v[l].r)+(v[r].c-v[l].c));
            squareSz[l][r] = maxDist + 1;
        }
    }

    for(int i = 0;i<n;i++)
    {
        leftestCover[i] = i;
        int d = squareSz[i][i];

        for(int j = 0;j<i;j++)
        {
            if(v[i].c-v[j].c<d && abs(v[i].r-v[j].r)<d)
            {
                leftestCover[i] = j;
                break;
            }
        }
    }
}

long long take_photos(int _n, int _m, int _k, vector<int> r, vector<int> c)
{
    n = _n;
    m = _m;
    k = _k;

    for(int i = 0;i<n;i++)
    {
        if(c[i]<r[i]) swap(c[i], r[i]);
    }

    for(int i = 0;i<n;i++) v.push_back(Point(r[i], c[i]));
    sort(v.begin(), v.end(), cmpCol);

    init();

    for(int i = 0;i<n;i++)
    {
        //cout << v[i].r << " --- " << v[i].c << '\n';
        if(i!=n-1 && v[i].c==v[i+1].c) continue;

        dp[i][0] = squareSz[0][i]*1LL*squareSz[0][i];
        for(int j = 1;j<k;j++)
        {
            int cover = i;
            for(int p = i;p>=1;p--)
            {
                cover = min(cover, leftestCover[p]);
                if(cover==p && v[p-1].c!=v[p].c)
                {
                    dp[i][j] = min(dp[i][j],
                                   dp[p-1][j-1] + squareSz[p][i]*1LL*squareSz[p][i] -
                                   (v[p-1].c-(v[i].c-squareSz[p][i]))*1LL*(v[p-1].c-(v[i].c-squareSz[p][i])) );
                }
            }
        }

        //cout << dp[i][0] << " " << dp[i][1] << '\n';
    }

    long long answer = 6996969969696996LL;
    for(int i = 0;i<k;i++) answer = min(answer, dp[n-1][i]);

    return answer;
}
/*
5 7 2
0 3
4 4
4 6
4 5
4 6
*/

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

aliens.cpp: In function 'void init()':
aliens.cpp:47:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Point>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |     for(int r = 0;r<v.size();r++)
      |                   ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...