Submission #968013

#TimeUsernameProblemLanguageResultExecution timeMemory
968013GrindMachineAliens (IOI16_aliens)C++17
100 / 100
1164 ms11812 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
template<typename T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
typedef long long int ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
 
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL)
#define pb push_back
#define endl '\n'
#define sz(a) (int)a.size()
#define setbits(x) __builtin_popcountll(x)
#define ff first
#define ss second
#define conts continue
#define ceil2(x,y) ((x+y-1)/(y))
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define yes cout << "Yes" << endl
#define no cout << "No" << endl
 
#define rep(i,n) for(int i = 0; i < n; ++i)
#define rep1(i,n) for(int i = 1; i <= n; ++i)
#define rev(i,s,e) for(int i = s; i >= e; --i)
#define trav(i,a) for(auto &i : a)
 
template<typename T>
void amin(T &a, T b) {
    a = min(a,b);
}
 
template<typename T>
void amax(T &a, T b) {
    a = max(a,b);
}
 
#ifdef LOCAL
#include "debug.h"
#else
#define debug(x) 42
#endif
 
/*
 
 
 
*/
 
const int MOD = 1e9 + 7;
const int N = 1e5 + 5;
const int inf1 = int(1e9) + 5;
const ll inf2 = ll(1e18) + 5;
 
#include "aliens.h"
 
struct Line{
    ld m,c;
    ll id;
 
    ld f(ll x){
        return m*x+c;
    }
 
    ll intersect(Line l){
        return ceil((ld)(l.c-c)/(m-l.m));
    }
};
 
struct CHT{
    deque<pair<Line,ll>> dq;
    
    void insert(Line l1){
        while(!dq.empty()){
            auto [l2,p] = dq.back();
            if(l1.f(p) <= l2.f(p)){
                dq.pop_back();
            }
            else{
                break;
            }
        }
 
        if(dq.empty()){
            dq.pb({l1,0});
        }
        else{
            ll p = l1.intersect(dq.back().ff);
            dq.pb({l1,p});
        }
    }
 
    pair<ld,ll> query(ll x){
        while(sz(dq) > 1){
            if(dq[1].ff.f(x) <= dq[0].ff.f(x)){
                dq.pop_front();
            }
            else{
                break;
            }
        }
 
        return {dq[0].ff.f(x),dq[0].ff.id};
    }
};
 
long long take_photos(int n, int m, int k, std::vector<int> R, std::vector<int> C) {
    vector<pll> a;
    rep(i,n) a.pb({min(R[i],C[i]),max(R[i],C[i])});
 
    auto cmp = [&](pll p1, pll p2){
        if(p1.ff != p2.ff) return p1.ff < p2.ff;
        return p1.ss > p2.ss;
    };
 
    sort(all(a),cmp);
    vector<pll> b;
    ll mx = -1;
 
    rep(i,n){
        if(a[i].ss > mx){
            mx = a[i].ss;
            b.pb(a[i]);
        }
    }
 
    a = b;
    n = sz(a);
    amin(k,n);
    a.insert(a.begin(),{-1,-1});
 
    auto sq = [&](ll x){
        return x*x;
    };
 
    auto get = [&](ld lambda) -> pair<ld,ll> {
        vector<ld> dp(n+5,inf2);
        vector<ll> cnt(n+5);
        dp[0] = 0;
        CHT cht;
 
        rep1(i,n){
            auto [l,r] = a[i];
            ll intersection = max(a[i-1].ss-l+1,0ll);
            cht.insert({-2*(l-1),sq(l-1)+dp[i-1]-sq(intersection),i});
            auto [val,ind] = cht.query(r);
            dp[i] = r*r+val+lambda;
            cnt[i] = cnt[ind-1]+1;
        }
 
        return {dp[n],cnt[n]};
    };
 
    ld lo = 0, hi = 1e12+5;
    ld lambda = -1;
 
    rep(iter,200){
        ld mid = (lo+hi)/2;
        auto [cost,cnt] = get(mid);
        if(cnt <= k){
            lambda = mid;
            hi = mid;
        }
        else{
            lo = mid;
        }
    }
    
    auto [cost,cnt] = get(lambda);
    ll ans = round(cost-k*lambda);
    return ans;
}

Compilation message (stderr)

aliens.cpp: In lambda function:
aliens.cpp:150:27: warning: narrowing conversion of '(-2 * (l - 1))' from 'std::tuple_element<0, std::pair<long long int, long long int> >::type' {aka 'long long int'} to 'ld' {aka 'long double'} [-Wnarrowing]
  150 |             cht.insert({-2*(l-1),sq(l-1)+dp[i-1]-sq(intersection),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...