結果
| 問題 | No.3722 Blended Taste |
| コンテスト | |
| ユーザー |
yurina256
|
| 提出日時 | 2026-09-19 14:07:01 |
| 言語 | C++23(gcc16) (gcc 16.1.0 + boost 1.92.0 + ACL) |
| 結果 |
WA
不安定
|
| 実行時間 | - |
| コード長 | 7,558 bytes |
| 記録 | |
| コンパイル時間 | 5,919 ms |
| コンパイル使用メモリ | 404,856 KB |
| 実行使用メモリ | 11,264 KB |
| 最終ジャッジ日時 | 2026-09-19 14:07:15 |
| 合計ジャッジ時間 | 10,288 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 40 WA * 1 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
using namespace atcoder;
using mint = modint998244353;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; i--)
#define rrep1(i, n) for (int i = (int)(n) - 1; i >= 1; i--)
#define ll long long
#define double long double
#define ull unsigned long long
#define sll __int128_t
#define sull __uint128_t
#define ALL(v) (v).begin(), (v).end()
#define NP next_permutation
#define PLL pair<long long, long long>
#define VL vector<long long>
#define VVL vector<vector<long long>>
#define VVVL vector<vector<vector<long long>>>
#define VPLL vector<pair<long long, long long>>
#define STL set<long long>
#define MPLL map<long long, long long>
#define SP fixed << setprecision(12)
#define hashmap unordered_set
#define popcount __builtin_popcountll
constexpr ll inf = 4001001001001001001ll;
constexpr ll mod = 998244353;
constexpr double pi = 3.141592653589793;
constexpr double eps = 0.00000000001;
vector<ll> d8x = {1, 1, 0, -1, -1, -1, 0, 1};
vector<ll> d8y = {0, 1, 1, 1, 0, -1, -1, -1};
vector<ll> d4x = {1, 0, -1, 0};
vector<ll> d4y = {0, 1, 0, -1};
// 小数出力
// cout << setprecision(12);
// struct
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;
struct Ruiseki {
vector<ll> v;
Ruiseki(vector<ll>& vec) {
ll n = vec.size();
v.resize(n + 1);
rep(i, n) v[i + 1] = v[i] + vec[i];
}
ll get(ll l, ll r) { // 開区間になりました
return v[r] - v[l];
}
};
// max
template <typename T1, typename T2>
inline bool chmax(T1& a, T2 b) { return a < b && (a = b, true); }
// min
template <typename T1, typename T2>
inline bool chmin(T1& a, T2 b) { return a > b && (a = b, true); }
// join
template <typename T>
string join(vector<T>& vec, const string& sp = " ") {
int si = vec.size();
if (si == 0) {
return "";
} else {
stringstream ss;
rep(i, si - 1) {
ss << vec[i] << sp;
}
ss << vec[si - 1];
return ss.str();
}
}
// print
template <typename T>
void pr_single(const T& x) {
if constexpr (requires { x.val(); }) cout << x.val();
else if constexpr (requires { typename T::value_type; } && !requires { x.substr(0); }) {
using elem_type = typename T::value_type;
constexpr bool is_container_of_container =
requires { typename elem_type::value_type; } &&
!requires(elem_type e) { e.substr(0); };
for (int i = 0; i < (int)x.size(); i++) {
pr_single(x[i]);
if (i != (int)x.size() - 1) {
if constexpr (is_container_of_container) {
cout << "\n";
} else {
cout << " ";
}
}
}
} else if constexpr (requires { x.first; x.second; }) {
pr_single(x.first);
cout << " ";
pr_single(x.second);
} else if constexpr (is_same_v<T, __int128_t> || is_same_v<T, __uint128_t>) {
using unsigned_type = __uint128_t;
unsigned_type value;
bool negative = false;
if constexpr (is_same_v<T, __int128_t>) {
negative = x < 0;
value = negative ? static_cast<unsigned_type>(-(x + 1)) + 1
: static_cast<unsigned_type>(x);
} else {
value = x;
}
string digits;
do {
digits.push_back('0' + static_cast<int>(value % 10));
value /= 10;
} while (value > 0);
if (negative) digits.push_back('-');
reverse(ALL(digits));
cout << digits;
} else if constexpr (requires { cout << x; }) {
cout << x;
}
}
void pr() { cout << endl; }
template <typename Head, typename... Tail>
void pr(const Head& head, const Tail&... tail) {
pr_single(head);
if constexpr (sizeof...(tail) > 0) {
cout << " ";
pr(tail...);
} else
cout << endl;
}
// Yes
string Yes(bool x) {
if (x) return "Yes\n";
return "No\n";
}
string YES(bool x) {
if (x) return "YES\n";
return "NO\n";
}
ll Digit(ll n) {
ll ans = 0;
while (n > 0) {
n /= 10;
ans++;
}
return ans;
}
bool in_range(int l, int x, int r) { // 閉区間
return ((l <= x) && (x <= r)) || ((r <= x) && (x <= l));
}
int div_ceil(int x, int y) {
return (x + y - 1) / y;
}
void yakubun(ll& a, ll& b) {
if (a < 0) {
a = -a;
b = -b;
}
if (a == 0) {
b = 1;
return;
}
if (b == 0) {
a = 1;
return;
}
ll g = gcd(abs(a), abs(b));
a /= g;
b /= g;
// pr(a, b);
}
void swap(pair<ll, ll>& p) {
auto [a, b] = p;
p = {b, a};
}
ll _sqrt(ll x) {
ll a = sqrt(x);
while ((a + 1) * (a + 1) <= x) a++;
while (a * a > x) a--;
return a;
}
ll _pow(ll x, ll n) {
ll res = 1;
while (n > 0) {
if (n & 1) res *= x;
x *= x;
n >>= 1;
}
return res;
}
ll bs(ll l, ll r, function<bool(ll)> f) { // l-> false, r->true
while (r - l > 1) {
ll mid = l + (r - l) / 2;
if (f(mid)) r = mid;
else
l = mid;
}
return r;
}
void solve() {
}
struct GetKth {
multiset<string> lower;
multiset<string> upper;
ll k;
GetKth(ll a) {
k = a;
}
void insert(string n) {
lower.insert(n);
if ((ll)lower.size() > k) {
string a = *lower.rbegin();
lower.erase(lower.find(a));
upper.insert(a);
}
}
string get() {
if ((ll)lower.size() < k) return "xxxxxxx";
else
return *lower.rbegin();
}
void erase(string n) {
if (n <= get()) {
// print("erase",n);
lower.erase(lower.find(n));
if ((ll)upper.size() > 0) {
string a = *upper.begin();
// print("move",a);
upper.erase(upper.find(a));
lower.insert(a);
}
} else {
upper.erase(upper.find(n));
}
}
ll size() {
return upper.size() + lower.size();
}
};
vector<vector<ll>> solve(vector<ll> v) {
ll n = v.size();
vector<vector<ll>> ans(21);
rep(bit, 1 << n) {
ll val = 0;
ll cnt = 0;
rep(i, n) {
if (!((bit >> i) & 1)) continue;
val += v[i];
cnt++;
}
ans[cnt].push_back(val);
}
rep(i, 21) sort(ALL(ans[i]));
return ans;
}
sll op(sll a, sll b) {
return a + b;
}
sll e() {
return 0;
}
struct UnionFind {
vector<int> data; // 負ならサイズ 正なら親ノード
UnionFind(int sz) {
data.assign(sz, -1);
}
bool unite(int x, int y) {
x = find(x), y = find(y);
if (x == y) return (false);
if (data[x] > data[y]) swap(x, y); // Xの方が大きい状態にする
data[x] += data[y];
data[y] = x;
return (true);
}
int find(int k) {
if (data[k] < 0) return (k);
return (data[k] = find(data[k]));
}
int size(int k) {
return (-data[find(k)]);
}
bool same(int x, int y) {
return find(x) == find(y);
}
};
signed main() {
ll n, m, k;
cin >> n >> m >> k;
if (k * k < m) {
cout << -1 << endl;
} else if (n == m) {
vector<vector<ll>> ans(n, vector<ll>(n, -1));
rep(i, n) {
rep(j, n) {
ans[i][j] = (i + j * k) % n + 1;
}
}
pr(ans);
} else {
vector<vector<ll>> ans(n, vector<ll>(n, -1));
vector<ll> v(m, (n * n / m));
rep(i, n) {
rep(j, n) {
ll p = (i % k) * k + (j % k) + 1;
ans[i][j] = p;
if (p <= m) v[p - 1]--;
}
}
ll p = 0;
v.push_back(inf);
rep(i, n) {
rep(j, n) {
while (v[p] == 0) p++;
if (ans[i][j] > m) {
ans[i][j] = p + 1;
v[p]--;
}
}
}
pr(ans);
}
}
yurina256