제출 #533659

#제출 시각아이디문제언어결과실행 시간메모리
533659rumen_mAliens (IOI16_aliens)C++17
25 / 100
2077 ms588 KiB
// point (x,y) -> range (min(y,x), max(y,x))  and  range (min(y,N-x-1), max(y,N-x-1))
// sort ranges
// DP function f(i,k) = min f(j,k-1) + (e(i)-s(j+1)+1)^2 - (max((e(j)-s(j+1)+1), 0))^2

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

#define ll long long
#define MAXN 100001
#define pb push_back
#define INFI (~(1LL<<63))
#define sq(x) ((x) * (x))

struct range{
 ll s, e;
 friend bool operator < (const range &a, const range &b) {
  if (a.s == b.s)
   return (a.e > b.e) ? true : false;
  else
   return (a.s < b.s) ? true : false;
  }
};


struct point {
 ll x, y;
};

struct line {
 double m, c;
};

ll find(vector<range> r, int KK) {
 int n =  r.size();
 KK = min(KK, n);
 ll dp[2][n];
 int cur = 1, tar=0;
 ll res;
 for (int i=0; i<n; ++i) dp[0][i] = (r[i].e-r[0].s+1) * (r[i].e-r[0].s+1);
 for (int k=2; k<=KK; ++k) {
  tar = cur; cur = (cur+1) % 2;
  for (int i=k-1; i<n; ++i) {
   res = INFI;
   for (int j=k-2; j<i; ++j)
    res = min(res, dp[cur][j] + sq(r[i].e - r[j+1].s + 1LL) - sq(max(r[j].e - r[j+1].s + 1LL, 0LL)));
   dp[tar][i] = res;
  }
 }
 return dp[tar][n-1];
}

vector<range> parseRanges(range* r, int n) {
 sort(&r[0], &r[n]);
 vector<range> res;
 int cur = 0;
 res.pb(r[0]);
 for (int i=1; i<n; ++i)
  if (r[cur].e < r[i].s || r[cur].e < r[i].e) {
   cur = i;
   res.pb(r[i]);
  }
 return res;
}

long long take_photos(int n, int m, int k, vector<int> row, vector<int> col) {
 point *p = (point*)malloc(MAXN * sizeof(point));
 range *r = (range*)malloc(MAXN * sizeof(range));
 for (int i=0; i<n; ++i) {
  r[i].s = min(row[i], col[i]);
  r[i].e = max(row[i], col[i]);
 }
 vector<range> R = parseRanges(r, n);
 ll res = find(R, k);
 // for (int i=0; i<n; ++i) {
 //  r[i].s = min(p[i].y,m-p[i].x-1);
 //  r[i].e = max(p[i].y,m-p[i].x-1);
 // }
 // R = parseRanges(r, n);
 // res = min(res, find(R, k));
 return res;
}

// BEGIN CUT
/*
int main() {
    int n, m, k;
    scanf("%d %d %d", &n, &m, &k);
    std::vector<int> r(n), c(n);
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &r[i], &c[i]);
    }
    long long ans = take_photos(n, m, k, r, c);

    // BEGIN SECRET
    puts("098d134608c94f7413faac591054ee35");
    // END SECRET

    printf("%lld\n", ans);
    return 0;
}*/

// END CUT

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

aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:68:9: warning: unused variable 'p' [-Wunused-variable]
   68 |  point *p = (point*)malloc(MAXN * sizeof(point));
      |         ^
#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...