Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define err(...) fprintf(stderr, __VA_ARGS__), fprintf(stderr, "\n"), fflush(stderr)
- typedef long long ll;
- using namespace std;
- #define TASK "braess"
- vector<vector<int>> T = { { 0, 1, 2, 3, 4, 5 },
- { 0, 3, 4, 2, 1, 5 },
- { 1, 5, 0, 2, 3, 4 },
- };
- vector<vector<int>> Q = { { 0, 1, 2, 3, 4, 5, 6, 7, },
- { 0, 2, 4, 1, 3, 5, 6, 7 },
- { 0, 7, 6, 5, 3, 2, 1, 4 },
- };
- vector<vector<int>> getG(vector<int> G) {
- vector<vector<int>> T1(G.size());
- int n1 = (int)G.size() / 2;
- for (int i = 0; i <= n1; i++) {
- if (i > 0) T1[G[i]].push_back(G[i - 1]);
- if (i < n1) T1[G[i]].push_back(G[i + 1]);
- if (i > 0 && i < n1) T1[G[i]].push_back(G[i + n1]), T1[G[i + n1]].push_back(G[i]);
- }
- return T1;
- }
- vector<vector<int>> del(vector<vector<int> > G, int a, int b) {
- for (int i = 0; i < (int)G.size(); i++) {
- for (int q = 0; q < (int)G[i].size(); q++) {
- int j = G[i][q];
- if (i == a && j == b || i == b && j == a) {
- G[i].erase(G[i].begin() + q);
- break;
- }
- }
- }
- return G;
- }
- vector<vector<int>> del(vector<vector<int> > G, int p) {
- for (int i = 0; i < (int)G.size(); i++) if (i != p) {
- for (int q = 0; q < (int)G[i].size(); q++) {
- int j = G[i][q];
- if (j == p) {
- G[i].erase(G[i].begin() + q);
- break;
- }
- }
- }
- G.erase(G.begin() + p);
- for (int v = 0; v < (int)G.size(); v++) {
- for (int &to : G[v]) {
- if (to > p) to--;
- }
- }
- return G;
- }
- vector<int> concat(vector<int> G, vector<int> A) {
- auto t1 = getG(G);
- auto t2 = getG(A);
- vector<vector<int>> res(G.size() + A.size());
- for (int v = 0; v < (int)G.size(); v++) {
- for (int to : t1[v]) {
- res[v].push_back(to);
- }
- }
- for (int v = 0; v < (int)A.size(); v++) {
- for (int to : t2[v]) {
- res[v + (int)G.size()].push_back(to + (int)G.size());
- }
- }
- res[G[G.size() / 2 - 1]].push_back((int)G.size() + A[1]);
- res[(int)G.size() + A[1]].push_back(G[G.size() / 2 - 1]);
- res = del(res, G[G.size() / 2], G[G.size() / 2 - 1]);
- res = del(res, (int)G.size() + A[0], (int)G.size() + A[1]);
- res = del(res, G[G.size() / 2]);
- res = del(res, (int)G.size() + A[0]);
- for(int v = 0; v < (int)res.size(); v++) {
- for (int to :res[v]) {
- if ( v < to) err("%d--->%d",v, to);
- }
- }
- int nxt = -1;
- vector<int> used((int)res.size());
- vector<int> num(res.size());
- int cnt = 0;
- for (int v = 0; v < (int)res.size(); v = nxt) {
- vector<int> cur;
- for (int to : res[v]) if (!used[to]) {
- cur.push_back(to);
- }
- num[v] = cnt++;
- used[v] = 1;
- for (int x : cur) used[x] = 1;
- if (cur.empty()) break;
- if (cur.size() == 1) {
- nxt = cur[0];
- } else {
- assert(cur.size() == 2);
- if (res[cur[0]].size() == 1) nxt = cur[0];
- else nxt = cur[1];
- for (int q = 0; q < (int)cur.size(); q++) {
- if (cur[q] != nxt) {
- num[cur[q]] = num[v] + (int) res.size() / 2;
- }
- }
- }
- }
- return num;
- }
- void solve() {
- int n;
- cin >> n;
- for (int i = 0; i < 3; i++) {
- vector<int> G = T[i];
- if (n % 2 == 0) G = Q[i];
- for (int j = 0; j < (n - 3) / 2; j++) {
- G = concat(G, T[i]);
- }
- for (auto v : G) {
- cout << v + 1 << ' ';
- }
- cout << '\n';
- }
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- #ifdef SIR
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #else
- freopen(TASK".in", "r", stdin);
- freopen(TASK".out", "w", stdout);
- #endif
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement