結果
問題 |
No.703 ゴミ拾い Easy
|
ユーザー |
![]() |
提出日時 | 2025-03-19 16:09:08 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.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]; }