제출 #1135294

#제출 시각아이디문제언어결과실행 시간메모리
1135294Szymon_PilipczukRoad Service 2 (JOI24_ho_t5)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h> using namespace std; vector<vector<vector<bool>>> gr; vector<int> cs; vector<vector<int>> sp; vector<pair<int,int>> spp; int csp = 0; vector<vector<int>> jm[21]; vector<int> mx; vector<int> mx2; int h,w,q; void dfs(int i,int j,int s) { spp[s].first = min(spp[s].first,i); spp[s].second = max(spp[s].second,i); sp[i][j] = s; if(gr[i][j][0] && sp[i-1][j] == -1) { dfs(i-1,j,s); } if(gr[i][j][1] && sp[i][j+1] == -1) { dfs(i,j+1,s); } if(gr[i][j][2] && sp[i+1][j] == -1) { dfs(i+1,j,s); } if(gr[i][j][3] && sp[i][j-1] == -1) { dfs(i,j-1,s); } } vector<int> tr; void add(int p,int v) { p+=h; tr[p] = v; p/=2; while(p > 0) { tr[p] = min(tr[p*2],tr[p*2+1]); p/=2; } } int check(int l,int r) { l+=h; r+=h; int ans = min(tr[l],tr[r]); while(l/2 != r/2) { if(l%2 == 0) ans = min(ans,tr[l+1]); if(r%2 == 1) ans = min(ans, tr[r-1]); l/=2;r/=2; } return ans; } int main() { cin>>h>>w>>q; gr.resize(h); sp.resize(h); for(int i = 0;i<h;i++) { sp[i].resize(w); gr[i].resize(w); for(int j =0;j<w;j++) { sp[i][j] = -1; gr[i][j].resize(4); } } for(int i =0;i<h;i++) { for(int j = 0;j<w-1;j++) { char c; cin>>c; if(c == '1') { gr[i][j][1] = true; gr[i][j+1][3] = true; } } } for(int i = 0;i<h-1;i++) { for(int j = 0;j<w;j++) { char c; cin>>c; if(c == '1') { gr[i][j][2] = true; gr[i+1][j][0] =true; } } } cs.resize(h); tr.resize(h*2); for(int i =0;i<h;i++) { cin>>cs[i]; add(i,cs[i]); } for(int i = 0;i<h;i++) { for(int j = 0;j<w;j++) { if(sp[i][j] == -1) { spp.push_back({i,i}); dfs(i,j,csp); csp++; } } } for(int o = 0;o<21;o++) { jm[o].resize(h); for(int i = 0;i<h;i++) { jm[o][i].resize(3); } } mx.resize(h); mx2.resize(h); for(int i = 0;i<csp;i++) { for(int j = spp[i].first;j<=spp[i].second;j++) { if(cs[j] == 1) { jm[0][j][1] = max(jm[0][j][1],spp[i].second); } else { jm[0][j][2] = max(jm[0][j][2],spp[i].second); } } } for(int i = 0;i<h;i++) { jm[0][i][2] = max(jm[0][i][2],jm[0][jm[0][i][1]][1]); } for(int i = 0;i<h;i++) { jm[0][i][0] = i; } for(int o = 1;o<21;o++) { for(int i = 0;i<h;i++) { jm[o][i][0] = max(jm[o-1][jm[o-1][i][0]][1],jm[o-1][jm[o-1][i][1]][0]); jm[o][i][1] = max(jm[o-1][jm[o-1][i][2]][0],jm[o-1][jm[o-1][i][1]][1]); jm[o][i][2] = max(jm[o-1][jm[o-1][i][1]][2],jm[o-1][jm[o-1][i][2]][1]); } } for(int i = 0;i<q;i++) { int t; cin>>t; vector<pair<int,int>> p; set<int> e; int a,b; cin>>a>>b; a--;b--; int x,y; cin>>x>>y; x--;y--; //cout<<spp[sp[a][b]].first<<" "<<spp[sp[a][b]].second<<" "<<spp[sp[x][y]].first<<" "<<spp[sp[x][y]].second<<"\n"; if(spp[sp[a][b]] > spp[sp[x][y]]) { swap(a,x); swap(b,y); } //if(i == 1) return 0; if(sp[a][b] == sp[x][y]) { cout<<0<<"\n"; continue; } //if(i == 1) return 0; /*if(i == 2) { return 0; }*/ if(spp[sp[a][b]].second >= spp[sp[x][y]].first) { cout<<check(spp[sp[x][y]].first,spp[sp[a][b]].second)<<"\n"; continue; } //if(i == 1) return 0; int cu0 = spp[sp[a][b]].second; int cu = jm[0][cu0][1]; int cu2 = jm[0][cu0][2]; if(cu >= spp[sp[x][y]].first) { cout<<check(spp[sp[x][y]].first,cu)+1<<"\n"; continue; } /*for(int j = 0;j<t;j++) { int x,y; cin>>x>>y; x--;y--; if(e.find(sp[x][y]) == e.end()) { p.push_back({spp[sp[x][y]].first,sp[x][y]}); e.insert(sp[x][y]); } } sort(p.begin(),p.end()); cu0 = spp[p[0].second].second; cu = spp[p[0].second].second; cu2 = spp[p[0].second].second;*/ int ans = 1; //if(i == 1) return 0; for(int o = 20;o>=0;o--) { if(max(jm[o][cu2][0],jm[o][cu][1]) < spp[sp[x][y]].first) { int cc = jm[o][cu2][0]; cu0 = max(jm[o][cu0][1],jm[o][cu][0]); cu2 = max(jm[o][cu][2],jm[o][cu2][1]); cu = max(jm[o][cu][1],cc); ans+=(1<<o); } } cu = max(jm[0][cu0][2],jm[0][cu][1]); ans++; cout<<ans+check(spp[sp[x][y]].first,cu)<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...