Submission #961735

#TimeUsernameProblemLanguageResultExecution timeMemory
961735Ahmed57Aliens (IOI16_aliens)C++17
60 / 100
1685 ms1048576 KiB
#include <bits/stdc++.h>
#include "aliens.h"

using namespace std;
struct line {
    long long m, c;
};
struct CHT {
    deque <line> lines;
    bool cmp(const pair <long long, long long> &x, const pair <long long,long long> &y) {
        return (x.first) * (y.second) < (x.second) * (y.first);
    }
    void push(line x) {
        if(lines.size() && lines.back().m == x.m) {
            if(x.c <= lines.back().c) lines.pop_back();
            else return;
        }
        while(lines.size() >= 2 && cmp({lines.back().c - x.c, x.m - lines.back().m}, {lines[lines.size() - 2].c - lines.back().c, lines.back().m - lines[lines.size() - 2].m})) lines.pop_back();
        lines.push_back(x);
    }
    long long query(long long x) {
        while(lines.size() >= 2 && cmp({lines[1].c - lines[0].c, lines[0].m - lines[1].m}, {x, 1})) lines.pop_front();
        return lines[0].m * x + lines[0].c;
    }
};
long long take_photos(int n, int m, int k, vector<int> r,vector<int> c){
    vector<pair<long long,long long>> seg1,seg;
    for(int i = 0;i<n;i++){
        seg1.push_back({min(c[i],r[i]),max(c[i],r[i])});
    }
    sort(seg1.begin(),seg1.end());
    long long ma = -1e18;
    for(int i = 0;i<n;i++){
        if(seg1[i].second>ma){
            seg.push_back(seg1[i]);
            ma = seg1[i].second;
        }
    }
    long long dp[seg.size()+1][k+1];
    for(int i = 0;i<=k;i++)dp[0][i] = 0;
    for(int i = 1;i<=seg.size();i++)dp[i][0] =1e18;
    for(int j = 1;j<=k;j++){
        CHT cht;
        for(int i = 1;i<=seg.size();i++){
            int e = i-1;
            line pu = {(-2)*seg[e].first,dp[e][j-1]+seg[e].first*seg[e].first-2*seg[e].first+1-(e==0?0:max(0ll,seg[e-1].second-seg[e].first+1)*max(0ll,seg[e-1].second-seg[e].first+1))};
            cht.push(pu);
            
            dp[i][j] = cht.query(seg[i-1].second)+seg[i-1].second*seg[i-1].second+2*seg[i-1].second;
        }
    }
    return dp[seg.size()][k];
}

Compilation message (stderr)

aliens.cpp: In function 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)':
aliens.cpp:41:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   41 |     for(int i = 1;i<=seg.size();i++)dp[i][0] =1e18;
      |                   ~^~~~~~~~~~~~
aliens.cpp:44:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |         for(int i = 1;i<=seg.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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...