結果
| 問題 | No.703 ゴミ拾い Easy |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-03-19 16:09:08 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 164 ms / 1,500 ms |
| コード長 | 1,542 bytes |
| 記録 | |
| コンパイル時間 | 2,002 ms |
| コンパイル使用メモリ | 195,088 KB |
| 実行使用メモリ | 37,648 KB |
| 最終ジャッジ日時 | 2025-03-19 16:09:16 |
| 合計ジャッジ時間 | 7,833 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 46 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:70:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
70 | scanf("%d",&a[i]);
| ~~~~~^~~~~~~~~~~~
main.cpp:72:36: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
72 | for(int i=1;i<=n;i++) scanf("%d",&x[i]);
| ~~~~~^~~~~~~~~~~~
main.cpp:73:36: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
73 | for(int i=1;i<=n;i++) scanf("%d",&y[i]);
| ~~~~~^~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
const long long inf=1e18;
int a[N];
int x[N];
int y[N];
long long dp[N];
struct node
{
long long k,b;
int l,r;
long long gety(long long x){return k*x+b;}
}tr[N<<2];
void build(int id,int l,int r)
{
tr[id]={0,inf,l,r};
if(l==r) return;
int mid=(l+r)>>1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
}
void change(int id,node p)
{
int l=tr[id].l,r=tr[id].r;
int mid=(l+r)>>1;
if(p.l<=l&&r<=p.r)
{
if(p.gety(l)<tr[id].gety(l)&&p.gety(r)<tr[id].gety(r))
{
tr[id].k=p.k;
tr[id].b=p.b;
}
if(tr[id].l==tr[id].r) return;
if(p.gety(mid)<tr[id].gety(mid))
{
swap(tr[id].k,p.k);
swap(tr[id].b,p.b);
}
if(p.gety(l)<tr[id].gety(l))
{
change(id<<1,p);
}
if(p.gety(r)<tr[id].gety(r))
{
change(id<<1|1,p);
}
}
else
{
if(p.l<=mid) change(id<<1,p);
if(p.r>mid) change(id<<1|1,p);
}
}
long long query(int id,int x)
{
if(tr[id].l==tr[id].r) return tr[id].gety(x);
int mid=(tr[id].l+tr[id].r)>>1;
long long ans=tr[id].gety(x);
if(x<=mid) return min(ans,query(id<<1,x));
else return min(ans,query(id<<1|1,x));
}
int main()
{
int n;
cin>>n;
build(1,-200000,200000);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++) scanf("%d",&x[i]);
for(int i=1;i<=n;i++) scanf("%d",&y[i]);
change(1,{x[1],1LL*y[1]*y[1]+1LL*x[1]*x[1],-200000,200000});
for(int i=1;i<=n;i++)
{
dp[i]=1LL*a[i]*a[i]+query(1,-2LL*a[i]);
change(1,{x[i+1],1LL*y[i+1]*y[i+1]+1LL*x[i+1]*x[i+1]+dp[i],-200000,200000});
}
cout<<dp[n];
}
vjudge1