結果
問題 | No.2657 Falling Block Game |
ユーザー | kotatsugame |
提出日時 | 2024-03-01 21:50:42 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 390 ms / 2,000 ms |
コード長 | 902 bytes |
コンパイル時間 | 864 ms |
コンパイル使用メモリ | 79,716 KB |
実行使用メモリ | 9,904 KB |
最終ジャッジ日時 | 2024-09-29 13:48:00 |
合計ジャッジ時間 | 6,452 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 37 |
ソースコード
#include<iostream> #include<cassert> #include<atcoder/segtree> using namespace std; int op(int a,int b){return min(a,b);} int e(){return(int)1e9;} int H,W; string S[1<<17]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>H>>W; for(int i=0;i<H;i++)cin>>S[i]; vector<int>prv(W,0); for(int i=H-2;i>=0;i--) { atcoder::segtree<int,op,e>seg(W); int l=0,r=0; while(r<W&&S[i][r]!='#') { seg.set(r,prv[r]); r++; } for(int j=0;j<W;j++) { if(S[i][j]=='#') { assert(l<=r&&r==j); r++; while(r<W&&S[i][r]!='#') { seg.set(r,prv[r]); r++; } while(l<=j)seg.set(l++,(int)1e9); prv[j]=1e9; } if(S[i][j]=='.') { int l=-1,r=W; while(r-l>1) { int mid=(l+r)/2; if(seg.prod(max(j-mid,0),min(j+mid+1,W))<=mid)r=mid; else l=mid; } prv[j]=r; } } } for(int j=0;j<W;j++)cout<<prv[j]<<"\n"; }