この想定解賢いな。
https://yukicoder.me/problems/no/1910
問題
H*Wの行列Aを考える。
ここで、長さHの数列Rと長さWの数列Cが与えられる。
数列の高さとは、数列の要素中、それ自身より手前にある値のどれよりも多いものの数を示す。
行列のr行目だけ抜き出した数列の高さがR[r]であり、c行目だけ抜き出した数列の高さがC[c]である行列を構成せよ。
ただし、R[0]=C[0]=1とする。
解法
2行目・2列目以降は、A[r][c]=r+cとする。
こうすると、2行目・2列目以降だけ見ると全要素「それ自身より手前にある値のどれよりも多いもの」に該当する。
あとは1行目・1列目で調整する。
A[0][0]に大きな値を置くと、それ以外1行目・1列目は任意の値を置けるようになるので、それぞれR[r]・C[c]と合うような値に調整しよう。
int H,W; int R[505]; int C[505]; int A[505][505]; vector<int> E[505][505]; int in[505][505]; void solve() { int i,j,k,l,r,x,y; string s; cin>>H>>W; FOR(y,H) cin>>R[y]; FOR(x,W) cin>>C[x]; FOR(y,H) FOR(x,W) A[y][x]=y+x+2; A[0][0]=100000; for(y=1;y<H;y++) A[y][0]=A[y][W-R[y]]; for(x=1;x<W;x++) A[0][x]=A[H-C[x]][x]; FOR(y,H) { FOR(x,W) cout<<A[y][x]<<" "; cout<<endl; } }
まとめ
思いつかなかった…。