kmjp's blog

競技プログラミング参加記です

yukicoder : No.1910 High Element on Grid

この想定解賢いな。
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;
	}
	
	
}

まとめ

思いつかなかった…。