TopCoder SRM 720 Div1 Medium: DistinctGrid
実質Easy。頭が悪いので落とした。$-134$した。
solution
常に$nk + 1$種類の数字が使える。$k \le \frac{n}{2}$なので、$1$行ごとにずらすようにしても被らない。$O(n^2)$。
implementation
#include <bits/stdc++.h>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
using namespace std;
class DistinctGrid { public: vector<int> findGrid(int n, int k); };
vector<int> DistinctGrid::findGrid(int n, int k) {
vector<int> f(n * n);
if (k == 1) return f;
int cnt = 1;
repeat (y, n) {
repeat (x, k - 1) {
f[y * n + (y + x) % n] = cnt ++;
}
}
return f;
}