結果
問題 |
No.703 ゴミ拾い Easy
|
ユーザー |
![]() |
提出日時 | 2025-03-21 17:48:39 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 129 ms / 1,500 ms |
コード長 | 1,999 bytes |
コンパイル時間 | 1,662 ms |
コンパイル使用メモリ | 162,988 KB |
実行使用メモリ | 59,904 KB |
最終ジャッジ日時 | 2025-03-21 17:48:47 |
合計ジャッジ時間 | 6,908 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 46 |
ソースコード
#include<bits/stdc++.h> #define N 300005 #define int long long #define Eps 1e-6 using namespace std; struct line{ int k,b; bool flag;int ls,rs; line(){ ls=rs=0; } int get(const int x)const{ return k*x+b; } double getIntersectionX(const line &x)const{ return (b-x.b)/1.0/(x.k-k); } }; struct LiChaoTree{ line Tree[N<<2]; int Root,Ncnt; inline void Add(int &id,int L,int R,line p){ if(!id){ id=++Ncnt; } if(!Tree[id].flag){ Tree[id].k=p.k;Tree[id].b=p.b; Tree[id].flag=1; }else if(p.get(L)<Tree[id].get(L)&&p.get(R)<Tree[id].get(R)){ Tree[id].k=p.k;Tree[id].b=p.b; }else if(p.get(L)<Tree[id].get(L)||p.get(R)<Tree[id].get(R)){ int mid=L+R>>1; if(p.get(mid)<Tree[id].get(mid)){ swap(p.b,Tree[id].b);swap(p.k,Tree[id].k); } if((double)(mid)-p.getIntersectionX(Tree[id])>Eps){ Add(Tree[id].ls,L,mid,p); }else{ Add(Tree[id].rs,mid+1,R,p); } } } inline int Query(int id,int L,int R,int val){ if(!id){ return 1e18; } if(!Tree[id].flag){ return 1e18; } if(L==R){ if(!Tree[id].flag){ return 1e18; } return Tree[id].get(val); }int mid=L+R>>1; int Ans=Tree[id].get(val); if(val<=mid){ return min(Ans,Query(Tree[id].ls,L,mid,val)); }else{ return min(Ans,Query(Tree[id].rs,mid+1,R,val)); } } }LCTree; int n,dp[N],x[N],y[N],a[N]; signed main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ cin>>x[i]; } for(int i=1;i<=n;i++){ cin>>y[i]; } for(int i=1;i<=n;i++){ line p;p.b=dp[i-1]+y[i]*y[i]+x[i]*x[i];p.k=-2*x[i]; LCTree.Add(LCTree.Root,1,20000000,p); dp[i]=a[i]*a[i]+LCTree.Query(1,1,20000000,a[i]); }cout<<dp[n]; }