Submission #105303

#TimeUsernameProblemLanguageResultExecution timeMemory
105303evpipisAliens (IOI16_aliens)C++14
4 / 100
3 ms384 KiB
//#define TEST
 
#ifndef TEST
#include "aliens.h"
#endif
#include <bits/stdc++.h>
using namespace std;
 
#define fi first
#define se second
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int, int> ii;
 
const int len = 1e5+5;
const ll inf = 1e15;
int n, m, k;
ii arr[len];
vector<ii> vec;
ll com[len];
pair<double, int> dp[len];
 
int check(double c){
    for (int i = 1; i <= n; i++){
        pair<double, int> ans = mp(inf, 0);
        for (int j = 0; j < i; j++){
            ll temp = (vec[i].se-vec[j+1].fi+1)*1LL*(vec[i].se-vec[j+1].fi+1) - com[j];
            ans = min(ans, mp(dp[j].fi+temp, dp[j].se));
        }
 
        ans.fi += c;
        ans.se += 1;
        dp[i] = ans;
 
        //printf("i = %d, ans = (%f, %d)\n", i, ans.fi, ans.se);
    }
 
    return dp[n].se;
}
 
ll bs(){
    double l = 0, r = m*1LL*m, ans;
    int it = 100;
    while (it--){
        double mid = (l+r)/2;
        int cur = check(mid);
 
        //printf("mid = %f, cur = %d\n", mid, cur);
 
        if (cur <= k)
            ans = mid, r = mid;
        else
            l = mid;
        /*if (cur == k)
            return mid;
 
        if (cur < k)
            r = mid;
        else
            l = mid;
        */
    }
    
    return ans;
}
 
ll 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++){
        arr[i] = mp(R[i]+1, C[i]+1);
        if (arr[i].fi > arr[i].se)
            swap(arr[i].fi, arr[i].se);
    }
 
    sort(arr, arr+n);
 
    vec.pb(mp(1, 0));
    for (int i = 0; i < n; i++){
        while (vec.size() > 1 && vec.back().fi == arr[i].fi)
            vec.pop_back();
        if (arr[i].se > vec.back().se)
            vec.pb(arr[i]);
    }
    n = vec.size()-1;
    k = min(n, k);
 
    for (int i = 0; i < n; i++){
        if (vec[i].se < vec[i+1].fi)
            com[i] = 0;
        else
            com[i] = (vec[i].se-vec[i+1].fi+1)*1LL*(vec[i].se-vec[i+1].fi+1);
    }
 
    //for (int i = 0; i <= n; i++)
      //  printf("%d %d\n", vec[i].fi, vec[i].se);
 
    double c = bs();
    int temp = check(c);
    //printf("ans = %f\n", dp[n].fi - k*c);
    return dp[n].fi - k*c;
}
 
#ifdef TEST
int main() {
    printf("hello1\n");
    int N, M, K;
    assert(3 == scanf("%d %d %d", &N, &M, &K));
    //printf("N = %d, M = %d, K = %d\n", N, M, K);
    vector<int> r(N), c(N);
    for (int i = 0; i < N; i++) {
        assert(2 == scanf("%d %d", &r[i], &c[i]));
    }
    long long ans = take_photos(N, M, K, r, c);
 
 
    printf("%lld\n", ans);
    return 0;
}
#endif

Compilation message (stderr)

aliens.cpp: In function 'll take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:100:9: warning: unused variable 'temp' [-Wunused-variable]
     int temp = check(c);
         ^~~~
aliens.cpp: In function 'll bs()':
aliens.cpp:65:12: warning: 'ans' may be used uninitialized in this function [-Wmaybe-uninitialized]
     return ans;
            ^~~
#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...