题解 菜肴挑选

传送门

奇诡无意义构造题

直接放题解因为这个思路根本不可想

点击查看代码
// ubsan: undefined
// accoders
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define pb push_back
#define ll long long
//#define int long long

char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
	int ans=0, f=1; char c=getchar();
	while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
	while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
	return ans*f;
}

int n;
vector<tuple<int, int, int>> sta;

signed main()
{
	freopen("dish.in", "r", stdin);
	freopen("dish.out", "w", stdout);

	n=read();
	if (n&1) {
		printf("%d\n", n*(n-1)/2);
		for (int i=0; i<n; ++i)
			for (int j=1; j<=n/2; ++j)
				printf("%d %d %d\n", i+1, (i-j+n)%n+1, (i+j)%n+1);
	}
	else {
		int m=n-1;
		for (int i=0; i<m; ++i)
			for (int j=1; j<=m/2; ++j)
				sta.pb({i+1, (i-j+m)%m+1, (i+j)%m+1});
		for (int i=0; i<m; ++i) sta.pb({i+1, (i+1)%m+1, n});
		for (int i=0; i<m; ++i) sta.pb({i+1, (i+1)%m+1, n});
		for (int i=0; i<m; ++i) sta.pb({i+1, (i+2)%m+1, n});
		for (int i=0; i<m; ++i)
			for (int j=2; j<=m/2; ++j)
				sta.pb({i+1, (i-j+m)%m+1, (i+j)%m+1});
		printf("%lu\n", sta.size());
		for (auto& it:sta) printf("%d %d %d\n", get<0>(it), get<1>(it), get<2>(it));
	}

	return 0;
}
posted @ 2022-07-30 08:06  Administrator-09  阅读(9)  评论(0)    收藏  举报