2023 rcpc
This commit is contained in:
123
2023/rcpc/d2/editorial/b-the-floor-is-lava-583.cpp
Normal file
123
2023/rcpc/d2/editorial/b-the-floor-is-lava-583.cpp
Normal file
@@ -0,0 +1,123 @@
|
||||
#include <bits/stdc++.h>
|
||||
#pragma GCC optimize("O3")
|
||||
|
||||
using namespace std;
|
||||
|
||||
int aint[2][1402][5602];
|
||||
int rmq[2][1402][14][1402];
|
||||
int logs[1402];
|
||||
|
||||
vector<vector<int> > rot(2000, vector<int> (2000));
|
||||
|
||||
void build(int LC, int poz, int nod, int L, int R)
|
||||
{
|
||||
for(int i = 1; i <= 1400; i++)
|
||||
{
|
||||
if(LC == 0)
|
||||
rmq[LC][poz][0][i] = rot[poz][i];
|
||||
else
|
||||
rmq[LC][poz][0][i] = rot[i][poz];
|
||||
//if(LC == 1 && poz == 703 && i >= 0 && i <= 15)
|
||||
//cout << rot[i][poz] << " ";
|
||||
}
|
||||
//if(LC == 1 && poz == 703)
|
||||
// cout << '\n';
|
||||
for(int i = 1; i <= logs[1400]; i++)
|
||||
{
|
||||
for(int j = 1; j + (1<<i) - 1 <= 1400; j++)
|
||||
{
|
||||
rmq[LC][poz][i][j] = max(rmq[LC][poz][i-1][j], rmq[LC][poz][i-1][j+(1<<(i-1))]);
|
||||
//if(LC == 1 && poz == 703 && j <= 15)
|
||||
// cout << rmq[LC][poz][i][j] << " ";
|
||||
}
|
||||
//if(LC == 1 && poz == 703)
|
||||
// cout << '\n';
|
||||
}
|
||||
}
|
||||
int query(int LC, int poz, int nod, int st, int dr, int L, int R)
|
||||
{
|
||||
int lg = logs[R-L+1];
|
||||
return max(rmq[LC][poz][lg][L], rmq[LC][poz][lg][R-(1<<lg)+1]);
|
||||
}
|
||||
|
||||
int minimaxi[1402], ans[500002];
|
||||
|
||||
int main()
|
||||
{
|
||||
ios_base::sync_with_stdio(false);
|
||||
cin.tie(NULL);
|
||||
|
||||
int n, m, k;
|
||||
cin >> n >> m >> k;
|
||||
|
||||
vector<vector<int> > v(n+1, vector<int> (m+1));
|
||||
for(int i = 1; i <= n; i++)
|
||||
for(int j = 1; j <= m; j++)
|
||||
cin >> v[i][j];
|
||||
|
||||
for(int i = 1; i <= n*m; i++)
|
||||
ans[i] = -1;
|
||||
|
||||
for(int i = 2; i <= 1400; i++)
|
||||
logs[i] = logs[i/2] + 1;
|
||||
|
||||
for(int i = 1; i <= n; i++)
|
||||
for(int j = 1; j <= m; j++)
|
||||
rot[i+j][i-j+700] = v[i][j];
|
||||
|
||||
for(int i = 1; i <= n+m; i++)
|
||||
build(0, i, 1, 1, 1400);
|
||||
for(int i = 1; i < 1400; i++)
|
||||
build(1, i, 1, 1, 1400);
|
||||
|
||||
for(int i = 0; i <= 1400; i++)
|
||||
minimaxi[i] = 1000000;
|
||||
|
||||
for(int i = 1; i <= k; i++)
|
||||
{
|
||||
int L, C;
|
||||
cin >> L >> C;
|
||||
int line = L+C;
|
||||
int column = L-C+700;
|
||||
int mxx = 0;
|
||||
for(int dist = 0; dist <= n+m; dist++)
|
||||
{
|
||||
bool ok = 0;
|
||||
// going up
|
||||
int first_line = max(1, line-dist);
|
||||
int last_line = min(1400, line+dist);
|
||||
int first_column = max(1, column-dist);
|
||||
int last_column = min(1400, column+dist);
|
||||
|
||||
//if(i == 3)
|
||||
// cout << i << " " << line << " " << column << " " << first_line << " " << last_line << " " << first_column << " " << last_column << '\n';
|
||||
if(first_line)
|
||||
ok = 1, mxx = max(mxx, query(0, first_line, 1, 1, 1400, first_column, last_column));
|
||||
if(last_line <= 1400)
|
||||
ok = 1, mxx = max(mxx, query(0, last_line, 1, 1, 1400, first_column, last_column));
|
||||
if(first_column)
|
||||
ok = 1, mxx = max(mxx, query(1, first_column, 1, 1, 1400, first_line, last_line));
|
||||
//if(i == 3)
|
||||
// cout << query(1, last_column, 1, 1, 1400, first_line, last_line) << '\n';
|
||||
if(last_column < 1400)
|
||||
ok = 1, mxx = max(mxx, query(1, last_column, 1, 1, 1400, first_line, last_line));
|
||||
minimaxi[dist] = min(minimaxi[dist], mxx);
|
||||
//if(i == 3 && mxx == 48)
|
||||
// cout << "CN " << line << " " << column << " " << dist << '\n';
|
||||
if(ok == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
int lst = 0;
|
||||
for(int i = 0; i <= 1400; i++)
|
||||
{
|
||||
if(minimaxi[i] <= n*m)
|
||||
for(int j = lst+1; j <= min(n*m, minimaxi[i]); j++)
|
||||
ans[j] = i;
|
||||
lst = minimaxi[i];
|
||||
}
|
||||
|
||||
for(int i = 1; i <= n*m; i++)
|
||||
cout << ans[i] << " ";
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user