思路:
首先我们思考一下,整个矩形最大的sum为多少?换句话说,忽略次数限制,最大sum的矩形每个数是怎么样分布的?
从中我们可以发现
1 2 3 4
2 2 3 4
3 3 3 4
4 4 4 4
这样的矩形是最大的,因为不论怎么改变这样的矩形,行和列都是由1 ,2 ,3 ,4 。。。分布
只能把它变小并不能变大。
那么接下来考虑我们能否在2*n的次数里面变成这个矩形或者往这个矩形的形式上变?
首先为了减少次数,每次修改的行或者列最好都要使sum变大。
因此以3*3的矩形为例:
0 0 1 0 0 1 0 1 1 0 1 1 1 2 3 1 2 3
0 0 2 ==》0 0 2 ==》 0 2 3 ==》1 2 3 ==》 1 2 3 ==》1 2 3
0 0 3 1 2 3 1 3 3 3 3 3 3 3 3 1 2 3
这样就是最大的方法
(注意n=1和n=2要特判)
代码附上:
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n;
void solve(){
cin>>n;
int sum=0;
int m;
if(n==1)m=1;
else if(n==2)m=3;
else m=2*n;
int k=1;
for(int i=1;i<=n;i++){
sum+=k*(2*i-1);
k++;
}
cout<<sum<<" "<<m<<"\n";
if(n==1){//特判
cout<<1<<" "<<1<<" "<<1<<"\n";
}
else if(n==2){
cout<<1<<" "<<1<<" "<<1<<" "<<2<<"\n";
cout<<1<<" "<<2<<" "<<1<<" "<<2<<"\n";
cout<<2<<" "<<1<<" "<<1<<" "<<2<<"\n";
}
else{
int pre=n;
for(int i=1;i<=n*2;i++){
if(i&1){
cout<<1<<" "<<pre<<" ";
}
else {
cout<<2<<" "<<pre<<" ";
pre--;
}
for(int i=1;i<=n;i++){
cout<<i<<" ";
}
cout<<"\n";
}
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}