이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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;
}
컴파일 시 표준 에러 (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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |