結果
問題 | No.704 ゴミ拾い Medium |
ユーザー |
![]() |
提出日時 | 2018-11-09 10:36:52 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 462 ms / 1,500 ms |
コード長 | 1,347 bytes |
コンパイル時間 | 802 ms |
コンパイル使用メモリ | 96,000 KB |
実行使用メモリ | 26,916 KB |
最終ジャッジ日時 | 2024-11-21 05:09:22 |
合計ジャッジ時間 | 12,811 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 44 |
ソースコード
#include <cstdio>#include <cstring>#include <iostream>#include <string>#include <cmath>#include <bitset>#include <vector>#include <map>#include <set>#include <queue>#include <deque>#include <algorithm>#include <complex>#include <unordered_map>#include <random>using namespace std;typedef long long int ll;typedef pair<ll, ll> P;const int MAX_N=1<<19;const ll INF=1e16;int m;ll dat[2][2*MAX_N-1];void init(int m_){m=1;while(m<m_) m*=2;for(int i=0; i<2*m-1; i++){dat[0][i]=INF;dat[1][i]=INF;}}void update(int t, int k, ll a){k+=m-1;dat[t][k]=a;while(k>0){k=(k-1)/2;dat[t][k]=min(dat[t][k*2+1], dat[t][k*2+2]);}}ll query(int t, int a, int b, int k, int l, int r){if(r<=a || b<=l) return INF;if(a<=l && r<=b){return dat[t][k];}else{ll vl=query(t, a, b, k*2+1, l, (l+r)/2);ll vr=query(t, a, b, k*2+2, (l+r)/2, r);return min(vl, vr);}}int main(){int n;cin>>n;ll a[300001], x[300001], y[300001];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];ll dp=0;int i0=1;init(n+1);for(int i=1; i<=n; i++){while(x[i0]<a[i] && i0<=n) i0++;update(0, i, y[i]-x[i]+dp);update(1, i, y[i]+x[i]+dp);dp=min(a[i]+query(0, 0, i0, 0, 0, m), -a[i]+query(1, i0, n+1, 0, 0, m));}cout<<dp<<endl;return 0;}