이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define db long double
#define II pair <ll,ll>
#define III pair <ll,II>
#define IV pair <vector <int>,vector <int> >
#define IDB pair <db,int>
#define TII pair <treap*,treap*>
#define fst first
#define snd second
#define BIT(x,i) ((x>>i)&1)
#define pi acos(-1)
#define to_radian(x) (x*pi/180.0)
#define to_degree(x) (x*180.0/pi)
#define Log(x) (31-__builtin_clz((int)x))
#define LogLL(x) (63-__builtin_clzll((ll)x))
using namespace std;
#include "aliens.h"
struct ConvexHull_Trick
{
struct Line { db a,b; int cnt; } st[100005];
int top,j;
void Init() { top=0; j=1; }
db intersect(Line x,Line y)
{
return (y.b-x.b)/(x.a-y.a);
}
void add(db a,db b,int cnt)
{
while(top>1)
{
db y1=intersect({ a,b },st[top-2]),y2=intersect(st[top-1],st[top-2]);
if(y1<y2 || (y1==y2 && st[top-1].cnt<cnt)) top--;
else break;
}
if(top>0) j=min(j,top);
else j=1;
st[++top]={ a,b,cnt };
}
IDB get(db x)
{
while(j<top)
{
db y1=x*st[j].a+st[j].b,y2=x*st[j+1].a+st[j+1].b;
if(y1>y2 || (y1==y2 && st[j].cnt<st[j+1].cnt)) j++;
else break;
}
return { x*st[j].a+st[j].b,st[j].cnt };
}
} CVH;
struct segment { ll l,r; } seg[100005];
int n,i,cnt[100005],del[100005];
db f[100005];
ll g[100005];
IDB cal(db pen)
{
CVH.Init();
for(i=0;i<=n;i++)
{
if(i>0)
{
II k=CVH.get(seg[i].r);
f[i]=k.fst+seg[i].r*seg[i].r+pen;
cnt[i]=k.snd+1;
}
if(i<n)
{
g[i]=seg[i+1].l;
CVH.add(-2*g[i],f[i]+g[i]*g[i]-max(0LL,seg[i].r-g[i])*max(0LL,seg[i].r-g[i]),cnt[i]);
}
}
return { f[n],cnt[n] };
}
ll take_photos(int _n,int m,int k,vector <int> x,vector <int> y)
{
n=_n;
for(i=0;i<n;i++)
{
x[i]++; y[i]++;
if(x[i]<=y[i]) seg[i+1]={ x[i]-1,y[i] };
else seg[i+1]={ y[i]-1,x[i] };
}
sort(seg+1,seg+n+1,[&](segment a,segment b){ return a.l<b.l || (a.l==b.l && a.r>b.r); });
priority_queue <II,vector <II>,greater <II> > h;
for(i=n;i>=1;i--)
{
while(h.size()>0 && h.top().fst<=seg[i].r)
{
del[h.top().snd]=1;
h.pop();
}
h.push({ seg[i].r,i });
}
vector <segment> tg;
for(i=1;i<=n;i++)
if(del[i]==0) tg.push_back(seg[i]);
n=0;
for(segment obj:tg) seg[++n]=obj;
k=min(k,n);
db l=0,r=1e15;
while(r-l>1e-9)
{
db mid=(l+r)/2;
if(cal(mid).snd>=k) l=mid; else r=mid;
}
return cal(l).fst-k*l;
}
/*
int main()
{
freopen("aliens.inp","r",stdin);
freopen("aliens.out","w",stdout);
int n,m,k,X,Y;
cin>>n>>m>>k;
vector <int> x,y;
for(int i=1;i<=n;i++) cin>>X,x.push_back(X);
for(int i=1;i<=n;i++) cin>>Y,y.push_back(Y);
cout<<take_photos(n,m,k,x,y);
}
*/
# | 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... |