結果
| 問題 | No.705 ゴミ拾い Hard |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2026-08-24 14:41:40 |
| 言語 | C++14 (gcc 15.2.0 + boost 1.90.0) |
| 結果 |
AC
|
| 実行時間 | 201 ms / 1,500 ms |
| + 871µs | |
| コード長 | 1,123 bytes |
| 記録 | |
| コンパイル時間 | 948 ms |
| コンパイル使用メモリ | 180,336 KB |
| 実行使用メモリ | 17,664 KB |
| 最終ジャッジ日時 | 2026-08-24 14:41:52 |
| 合計ジャッジ時間 | 6,909 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge2_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5;
int n,a[N],x[N],y[N],dp[N],q[N],pos[N],head,tail;
int cube(int v){
return v*v*v;
}
int calc(int i,int j){
return dp[j-1]+cube(llabs(a[i]-x[j]))+cube(llabs(y[j]));
}
int getPos(int j1,int j2){
int l=j2,r=n+1;
while(l<r){
int mid=(l+r)>>1;
if(calc(mid,j2)<=calc(mid,j1)) r=mid;
else l=mid+1;
}
return l;
}
signed main(){
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];
head=tail=dp[0]=0;
for(int i=1;i<=n;i++){
while(head<tail){
int j=q[tail-1],p=getPos(j,i);
if(p<=pos[tail-1]) tail--;
else{
q[tail]=i;
pos[tail]=p;
tail++;
break;
}
}
if(head==tail){
q[tail]=i;
pos[tail]=1;
tail++;
}
while(head+1<tail&&pos[head+1]<=i) head++;
int j=q[head];
dp[i]=calc(i,j);
}
cout<<dp[n];
return 0;
}
vjudge1