2941:Homogeneous Squares
keyword
行列 C
概要
サイズN*N (N<1000)の行列が与えられる。任意の置換σに対してΣa[i][ σ[i] ]が同じ値をとるかどうか判定する問題。
各行の階差数列が等しくなるかどうか判定すれば良い。なぜなら、a[i][k+1] - a[i][k] != a[j][k+1] - a[j][k]ならa[i][k] + a[j][k+1] != a[i][k+1] + a[j][k]だからこの部分を入れ換えればよいから。計算量O(N^2)でこれ以上はどうしようもないのに制限時間ギリギリだった。どうしろと。
int difs[1001]; main(){ int n, i, j, prev, cur, isOk; while(n = readint(), n){ isOk = 1; for(i=0;i<n;i++){ if(i==0){ for(j=0;j<n;j++){ cur = readint(); if(j){ difs[j] = cur - prev; } prev = cur; } } else{ for(j=0;j<n;j++){ cur = readint(); if(j && difs[j] != cur - prev){ isOk = 0; } prev = cur; } } } if(isOk)puts("homogeneous"); else puts("not homogeneous"); } }