結果
| 問題 |
No.703 ゴミ拾い Easy
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 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];
}
vjudge1