結果
問題 | No.703 ゴミ拾い Easy |
ユーザー |
|
提出日時 | 2018-07-23 16:34:53 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 53 ms / 1,500 ms |
コード長 | 1,919 bytes |
コンパイル時間 | 558 ms |
コンパイル使用メモリ | 47,356 KB |
実行使用メモリ | 13,280 KB |
最終ジャッジ日時 | 2025-01-02 13:57:51 |
合計ジャッジ時間 | 4,126 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 46 |
ソースコード
#include<cstdio>#include<cctype>#include<climits>#include<algorithm>inline int getint() {register char ch;while(!isdigit(ch=getchar()));register int x=ch^'0';while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');return x;}using int64=long long;const int N=3e5+1,LIM=1e5;int a[N],x[N],y[N];int64 f[N];using Line=std::pair<int64,int64>;class SegmentTree {#define _left <<1#define _right <<1|1#define mid ((b+e)>>1)private:Line node[LIM<<2];int64 calc(const Line &l,const int &x) const {return l.first*x+l.second;}public:void build(const int &p,const int &b,const int &e) {node[p]={0,LLONG_MAX};if(b==e) return;build(p _left,b,mid);build(p _right,mid+1,e);}void insert(const int &p,const int &b,const int &e,Line l1) {if(node[p].second==LLONG_MAX) {node[p]=l1;return;}Line l2=node[p];if(calc(l2,b)>=calc(l1,b)) std::swap(l1,l2);if(calc(l1,e)>=calc(l2,e)) {node[p]=l2;return;}if(b==e) return;const double c=1.*(l2.second-l1.second)/(l1.first-l2.first);if(c<=mid) {node[p]=l1;insert(p _left,b,mid,l2);} else {node[p]=l2;insert(p _right,mid+1,e,l1);}}int64 query(const int &p,const int &b,const int &e,const int &x) const {int64 ret=calc(node[p],x);if(b==e) return ret;if(x<=mid) ret=std::min(ret,query(p _left,b,mid,x));if(x>mid) ret=std::min(ret,query(p _right,mid+1,e,x));return ret;}#undef _left#undef _right#undef mid};SegmentTree t;int main() {const int n=getint();for(register int i=1;i<=n;i++) a[i]=getint();for(register int i=1;i<=n;i++) x[i]=getint();for(register int i=1;i<=n;i++) y[i]=getint();t.build(1,1,LIM);for(register int i=1;i<=n;i++) {t.insert(1,1,LIM,(Line){-2*x[i],(int64)x[i]*x[i]+(int64)y[i]*y[i]+f[i-1]});f[i]=t.query(1,1,LIM,a[i])+(int64)a[i]*a[i];}printf("%lld\n",f[n]);return 0;}