Day8T3

充分发扬人类智慧,发现可以使用如下方式构造:
实际上这就是题解了。

#include"plus.h"
#include<bits/stdc++.h>
using namespace std;
void sol(int n){
	if(n==3){
		Report(1,2,3);
	}
	else if(n==12){
		Report(1,11,12);
		Report(3,7,10);
		Report(4,5,9);
		Report(2,6,8);
	}
	else if(n==15){
		Report(1,14,15);
		Report(3,10,13);
		Report(4,8,12);
		Report(5,6,11);
		Report(2,7,9);
	}
	else if(n%3==0){
		if(n*(long long)(n+1)/2%2) sol(n-2);
		else{
			int k = n/3;
			if(n&1){
				for(int i=k/2;i>=1;i--) Report(k-i-i+1,i+k,k-i+1+k);
				Report((k-9)/4+(k-1)/4+k-k/2+2,k+k/2+1,(k-9)/4+(k-1)/4+k+k+3);
				Report((k-9)/4+(k-1)/4+1,k+k+1,k+k+(k-9)/4+(k-1)/4+2);
				for(int i=1;i<=(k-9)/4;i++) Report(3+(k-9)/4*2-i-i,k+k+(k-1)/4+1+i,k+k+(k-1)/4+4+(k-9)/4*2-i);
				Report(1,k+k+(k-1)/4+4+(k-9)/4*2,k+k+(k-1)/4+5+(k-9)/4*2);
				for(int i=1;i<=k-k/2-3-(k-9)/4;i++) Report(n-k-k-i-i,k+k+1+i,n-i+1);
			}
			else{
				for(int i=k/2;i>=1;i--) Report(k-i*2+2,i+k,k-i+2+k);
				Report(k+k/4*2-k/2-1,k+k/2+1,k+k+k/4*2);
				Report(k/4*2-1,k+k+2,k+k+k/4*2+1);
				for(int i=1;i<=k/4-2;i++) Report(k/4*2-i-i-1,k+k+k/4+i+1,k+k+k/4*3-i);
				Report(1,k+k+k/4*3,k+k+k/4*3+1);
				for(int i=1;i<=k-k/2-1-k/4;i++) Report(n-k-k-i-i-1,k+k+2+i,n-i+1);
			}
		}
	}
	else if(n%3==2) sol(n-1);
	else{
		int ptr1 = (n/3+1)/2+1+n/3,ptr2 = n-n/3/2+1;
		for(int i=1;i<=n/3;i++){
			Report(i,ptr1-i,ptr1);
			ptr1++;
			swap(ptr1,ptr2);
		}
	}
}
void Cut(int N){
	sol(N);
}
posted @ 2026-07-05 09:55  海因里奇  阅读(2)  评论(0)    收藏  举报