我是傻逼,赛后写了个 90pts,不知道正解是啥
乱搞做法的代码/kel 不知道和正解有没有类似
#include <iostream>
#include <vector>
#include <algorithm>
constexpr int N = 3005;
int n;
int cnt[N];
std::vector<int> pos[N];
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(nullptr);
std::cin >> n;
for (int i = 1; i < n; ++i) cnt[i] = n - i;
bool fail = false;
int now = 0;
for (int i = n - 1; i; --i) {
if (cnt[i] < 0) { fail = true; break; }
while (cnt[i] >= i) {
for (int j = 1; j <= i; ++j) pos[i].push_back(++now);
now += i, cnt[i] -= i;
}
if (i & 1) {
while (cnt[i]) {
for (int j = i; j > 0; j -= 2) {
--cnt[j];
pos[j].push_back(++now);
if (cnt[j] < 0) { fail = true; break; }
}
if (fail) break;
now += (i + 1) >> 1;
}
} else {
while (cnt[i]) {
for (int j = i; j > 0; j -= 2) {
--cnt[j];
pos[j].push_back(++now);
if (cnt[j] < 0) { fail = true; break; }
}
if (fail) break;
--cnt[(i >> 1) + 1];
pos[(i >> 1) + 1].push_back(++now);
if (cnt[(i >> 1) + 1] < 0) { fail = true; break; }
now += (i >> 1) + 1;
}
}
if (fail) break;
}
if (fail) { std::cout << "-1\n"; return 0; }
std::cout << n << '\n';
for (int i = 0; i < n; ++i) std::cout << i << ' ';
std::cout << '\n';
for (int i = 1; i < n; ++i) std::reverse(pos[i].begin(), pos[i].end());
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j) {
std::cout << i << ' ' << j << ' ' << pos[j - i].back() + 1 - i << '\n';
pos[j - i].pop_back();
}
return 0;
}