結果
| 問題 |
No.1008 Bench Craftsman
|
| コンテスト | |
| ユーザー |
beet
|
| 提出日時 | 2020-03-06 21:42:27 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,081 bytes |
| コンパイル時間 | 2,134 ms |
| コンパイル使用メモリ | 198,976 KB |
| 最終ジャッジ日時 | 2025-01-09 04:56:14 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 WA * 3 TLE * 1 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using Int = long long;
template<typename T1,typename T2> inline void chmin(T1 &a,T2 b){if(a>b) a=b;}
template<typename T1,typename T2> inline void chmax(T1 &a,T2 b){if(a<b) a=b;}
template <typename E>
struct SegmentTree{
using H = function<E(E,E)>;
Int n,height;
H h;
E ei;
vector<E> laz;
SegmentTree(H h,E ei):h(h),ei(ei){}
void init(Int n_){
n=1;height=0;
while(n<n_) n<<=1,height++;
laz.assign(2*n,ei);
}
inline void propagate(Int k){
if(laz[k]==ei) return;
laz[(k<<1)|0]=h(laz[(k<<1)|0],laz[k]);
laz[(k<<1)|1]=h(laz[(k<<1)|1],laz[k]);
laz[k]=ei;
}
inline void thrust(Int k){
for(Int i=height;i;i--) propagate(k>>i);
}
void update(Int a,Int b,E x){
if(a>=b) return;
thrust(a+=n);
thrust(b+=n-1);
for(Int l=a,r=b+1;l<r;l>>=1,r>>=1){
if(l&1) laz[l]=h(laz[l],x),l++;
if(r&1) --r,laz[r]=h(laz[r],x);
}
}
E get_val(Int a){
thrust(a+=n);
return laz[a];
}
void set_val(Int a,E x){
thrust(a+=n);
laz[a]=x;
}
};
//INSERT ABOVE HERE
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
Int n,m;
cin>>n>>m;
vector<Int> as(n);
for(Int i=0;i<n;i++) cin>>as[i];
vector<Int> xs(m),ws(m);
for(Int i=0;i<m;i++) cin>>xs[i]>>ws[i],xs[i]--;
auto h=[&](Int a,Int b){return a+b;};
SegmentTree<Int> d1(h,0);
SegmentTree<Int> d2(h,0);
auto check=
[&](Int c)->bool{
d1.init(n);d2.init(n);
for(Int i=0;i<m;i++){
Int x=xs[i];
Int d=c?(ws[i]/c):n;
// [l, r]
Int l=x-d,r=x+d;
chmax(l,0);
chmin(r,n-1);
d1.update(l,r+1,ws[i]);
d1.update(l,x+1,-x*c);
d2.update(l,x+1,+c);
d1.update(x,r+1,+x*c);
d2.update(x,r+1,-c);
}
for(Int i=0;i<n;i++)
if(d1.get_val(i)+d2.get_val(i)*i>as[i]) return 0;
return 1;
};
const Int INF = 1e5+10;
Int L=-1,R=INF;
while(L+1<R){
Int M=(L+R)>>1;
if(check(M)) R=M;
else L=M;
}
if(R==INF) R=-1;
cout<<R<<endl;
return 0;
}
beet