結果
問題 | No.2786 RMQ on Grid Path |
ユーザー | にしろ |
提出日時 | 2024-08-31 03:18:28 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 1,499 ms / 6,000 ms |
コード長 | 2,460 bytes |
コンパイル時間 | 6,009 ms |
コンパイル使用メモリ | 324,548 KB |
実行使用メモリ | 58,668 KB |
最終ジャッジ日時 | 2024-08-31 03:19:08 |
合計ジャッジ時間 | 39,426 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 4 ms
6,940 KB |
testcase_03 | AC | 4 ms
6,944 KB |
testcase_04 | AC | 3 ms
6,940 KB |
testcase_05 | AC | 4 ms
6,940 KB |
testcase_06 | AC | 4 ms
6,944 KB |
testcase_07 | AC | 4 ms
6,944 KB |
testcase_08 | AC | 3 ms
6,940 KB |
testcase_09 | AC | 3 ms
6,940 KB |
testcase_10 | AC | 3 ms
6,940 KB |
testcase_11 | AC | 3 ms
6,940 KB |
testcase_12 | AC | 1,441 ms
58,668 KB |
testcase_13 | AC | 1,452 ms
58,532 KB |
testcase_14 | AC | 1,448 ms
58,384 KB |
testcase_15 | AC | 1,426 ms
58,520 KB |
testcase_16 | AC | 1,447 ms
58,548 KB |
testcase_17 | AC | 1,463 ms
58,600 KB |
testcase_18 | AC | 1,408 ms
58,484 KB |
testcase_19 | AC | 1,439 ms
58,572 KB |
testcase_20 | AC | 1,473 ms
58,512 KB |
testcase_21 | AC | 1,499 ms
58,424 KB |
testcase_22 | AC | 1,232 ms
58,544 KB |
testcase_23 | AC | 1,264 ms
58,492 KB |
testcase_24 | AC | 727 ms
55,128 KB |
testcase_25 | AC | 717 ms
55,436 KB |
testcase_26 | AC | 743 ms
54,808 KB |
testcase_27 | AC | 392 ms
19,752 KB |
testcase_28 | AC | 368 ms
16,368 KB |
testcase_29 | AC | 1,168 ms
52,844 KB |
testcase_30 | AC | 359 ms
16,548 KB |
testcase_31 | AC | 49 ms
6,940 KB |
testcase_32 | AC | 628 ms
53,728 KB |
testcase_33 | AC | 307 ms
16,176 KB |
testcase_34 | AC | 647 ms
57,020 KB |
testcase_35 | AC | 671 ms
56,836 KB |
testcase_36 | AC | 652 ms
57,164 KB |
ソースコード
#include <bits/stdc++.h> #include <atcoder/all> using namespace std; using ll = long long; using ld = long double; using mint = atcoder::modint1000000007; const ll inf = 9e18; struct UnionFind{ vector<ll> par; vector<ll> size; UnionFind(ll n){ par.resize(2*(n+1),-1); size.resize(2*(n+1),1); } ll root(ll x){ if (par[x]==-1) return x; return par[x]=root(par[x]); } void unite(ll u,ll v){ ll uu=root(u),vv=root(v); if(uu==vv){ return; } if(size[uu]<size[vv]){ par[uu]=vv; size[vv]+=size[uu]; }else{ par[vv]=uu; size[uu]+=size[vv]; } return; } bool same(ll u,ll v){ return root(u)==root(v); } ll out_size(ll n){ return size[root(n)]; } }; bool in_out(ll x,ll y,ll h,ll w){ return 0<=x and x<h and 0<=y and y<w; } ll di[8]={1,-1,0,0,1,1,-1,-1}; ll dj[8]={0,0,1,-1,1,-1,-1,1}; int main(){ ios::sync_with_stdio(0); cin.tie(0); ll h,w; cin >> h >> w; vector a(h,vector<ll>(w)); for(ll i=0;i<h;i++){ for(ll j=0;j<w;j++){ cin >> a[i][j]; } } vector edge(h*w+1,vector<array<ll,4>>(0)); for(ll i=0;i<h;i++){ for(ll j=0;j<w;j++){ if(i+1<h){ ll cost=max(a[i][j],a[i+1][j]); edge[cost].push_back({i,j,i+1,j}); } if(j+1<w){ ll cost=max(a[i][j],a[i][j+1]); edge[cost].push_back({i,j,i,j+1}); } } } ll q; cin >> q; vector<array<ll,4>> sg(q); for(auto&[si,sj,gi,gj]:sg){ cin >> si >> sj >> gi >> gj; si--,sj--,gi--,gj--; } vector<ll> ok(q,h*w+2),ng(q,0); auto check=[&]()->bool { for(ll i=0;i<q;i++){ if(ok[i]-ng[i]>1) return true; } return false; }; while(check()){ vector mid(h*w+1,vector<ll>(0)); for(ll i=0;i<q;i++){ ll t=(ok[i]+ng[i])/2; mid[t].push_back(i); } UnionFind uf(h*w); for(ll t=0;t<=h*w;t++){ for(auto[i,j,x,y]:edge[t]){ uf.unite(x*w+y,i*w+j); } for(ll i:mid[t]){ auto[si,sj,gi,gj]=sg[i]; if(uf.same(si*w+sj,gi*w+gj)) ok[i]=t; else ng[i]=t; } } } for(ll i=0;i<q;i++){ cout << ok[i] << endl; } }