This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long int lint;
typedef __int128 llint;
typedef long double ldoub;
const int N = 1e5;
llint PREC = 1e10;
array<llint, 2> ransDat[N];
array<llint, 2> rans[N];
int sizeR = 0;
llint dp[N+1];
int dp2[N+1];
llint slope(llint sl1p1, llint sl1p2, llint sl2p1, llint sl2p2){
llint a = sl1p1, b = sl1p2, c = sl2p1, d = sl2p2;
for (int x = 0; x < 200; x ++){
llint k1 = sl1p1 / sl1p2;
llint k2 = sl2p1 / sl2p2;
if (k1 != k2){
return k1 - k2;
}
sl1p1 %= sl1p2;
sl2p1 %= sl2p2;
sl1p1 <<= 1;
sl2p1 <<= 1;
}
return 0;
}
void calc(llint adjust){
vector<array<llint, 3>> hull;
hull.push_back({rans[0][0], -rans[0][0] * rans[0][0], 0});
for (int x = 0; x < sizeR; x ++){
llint s = -2 * rans[x][1];
llint B = rans[x][1] * rans[x][1];
int a = 1, b = hull.size()-1;
while (a <= b){
int mid = (b-a+1)/2 + a;
llint slp1 = (hull[mid][1] - hull[mid-1][1]);
llint slp2 = (hull[mid][0] - hull[mid-1][0]);
if (slope(slp1, slp2, s, (llint)1) < 0){
b = mid-1;
}else {
a = mid+1;
}
}
int r = a-1;
dp[x] = -hull[r][1] + B + hull[r][0] * s + adjust;
dp2[x] = hull[r][2] + 1;
if (x == sizeR-1) continue;
llint right = min(rans[x][1], rans[x+1][0]);
array<llint, 3> p = {rans[x+1][0], -dp[x] + (rans[x][1] - right) * (rans[x][1] - right) - rans[x+1][0] * rans[x+1][0], dp2[x]};
while (hull.size() > 1){
llint sl1p1 = (p[1] - hull[hull.size()-2][1]);
llint sl1p2 = (p[0] - hull[hull.size()-2][0]);
llint sl2p1 = (hull[hull.size()-1][1] - hull[hull.size()-2][1]);
llint sl2p2 = (hull[hull.size()-1][0] - hull[hull.size()-2][0]);
if (slope(sl1p1, sl1p2, sl2p1, sl2p2) >= 0){
hull.pop_back();
}else {
break;
}
}
hull.push_back(p);
}
}
long long take_photos(int n, int m, int k, std::vector<int> r, std::vector<int> c) {
PREC = 10*m;
for (int x = 0; x < n; x ++){
ransDat[x][0] = PREC*min(r[x], c[x]);
ransDat[x][1] = PREC*(max(r[x], c[x]) + 1);
}
sort(ransDat, ransDat+n, [](array<llint, 2> a, array<llint, 2> b){return (a[0] == b[0] ? a[1] > b[1] : a[0] < b[0]);});
{
llint ma = 0;
for (int x = 0; x < n; x ++){
if (ma >= ransDat[x][1]){
continue;
}
ma = ransDat[x][1];
rans[sizeR++] = ransDat[x];
}
}
k = min(k, (int)sizeR);
llint a = -(llint)1e12 * PREC * PREC, b = (llint)1e12 * PREC * PREC;
pair<llint, int> up = {1e12 * PREC*PREC, -1};
pair<llint, int> low = {1e12 * PREC*PREC, -1};
while (a <= b){
llint mid = (b-a+1)/2 + a;
llint v = mid;
calc(v);
if (dp2[sizeR-1] == k){
llint val = dp[sizeR-1];
val -= k*v;
val /= PREC;
val /= PREC;
return (lint)val;
}
if (dp2[sizeR-1] < k){
llint val = dp[sizeR-1];
val -= dp2[sizeR-1]*v;
val /= PREC;
val /= PREC;
up = {val, dp2[sizeR-1]};
b = mid-1;
}else {
llint val = dp[sizeR-1];
val -= dp2[sizeR-1]*v;
val /= PREC;
val /= PREC;
low = {val, dp2[sizeR-1]};
a = mid+1;
}
}
llint best = ((up.first-low.first) * (k-low.second))/(up.second - low.second) + low.first;
return best;
}
Compilation message (stderr)
aliens.cpp: In function 'llint slope(llint, llint, llint, llint)':
aliens.cpp:20:8: warning: unused variable 'a' [-Wunused-variable]
20 | llint a = sl1p1, b = sl1p2, c = sl2p1, d = sl2p2;
| ^
aliens.cpp:20:19: warning: unused variable 'b' [-Wunused-variable]
20 | llint a = sl1p1, b = sl1p2, c = sl2p1, d = sl2p2;
| ^
aliens.cpp:20:30: warning: unused variable 'c' [-Wunused-variable]
20 | llint a = sl1p1, b = sl1p2, c = sl2p1, d = sl2p2;
| ^
aliens.cpp:20:41: warning: unused variable 'd' [-Wunused-variable]
20 | llint a = sl1p1, b = sl1p2, c = sl2p1, d = sl2p2;
| ^
# | 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... |