CF1934E
思路借鉴了 rainboy 大佬,拜谢。
主要记录一下思考过程吧,这题还是比较巧妙的。
首先注意到操作次数的上界大约是
这成为了突破口,我们大胆猜测每个位置至多操作一次的话,那么将会有一半的位置值不会变。
那这一半左右的位置究竟是哪些呢?
跟一半有关的东西大概有:奇偶,前一半后一半。
这题看样子就跟奇偶没差本质联系,所以从后者开始思考。
首先大胆猜测应该前一半尽量不操作,后一半操作。因为不断操作小的数
那我们可以从
如果
如果
如果
还有些细节就是这么构造可能会剩下不到三个数,有点讨厌。
方法是在一开始的时候操作
总而言之就是这种构造需要大胆猜测加上细致分析,还是非常困难的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+3;
void Solve()
{
ll n,m,k;cin>>n;k=n;m=(n+1)/2;
cout<<(m+2)/3<<endl;
if(m%3)cout<<1<<" "<<k-1<<" "<<k<<endl,k-=2;
for(;k*2>n;k-=3)
{
if(k%2)cout<<k-2<<" "<<k-1<<" "<<k<<endl;
else if(k%4)cout<<k/2<<" "<<k-2<<" "<<k-1<<endl;
else cout<<k/2-1<<" "<<k-1<<" "<<k<<endl;
}
}
int main()
{
int T;cin>>T;
while(T--)Solve();
return 0;
}