题目链接
题目大意
给你一个长为n的数组,要你进行三次操作使得整个数组变为0. 操作定义为:每次选择[l,r]的区间,然后输入一个长为r-l+1的数组b[i],使得每个a[i]+=b[i],要求b[i]是r-l+1的倍数
题目思路
当n=1的时候显然可以前两次操作加0,最后一次操作-a[1] 否则可以第一次操作为[1,n-1]每次元素都加上(n-1)*a[i],第二次操作为第n个元素加上(n-1)a[n],最后一次操作为每个元素都加上-na[i]. 至于为什么要往这方面去想,我觉得就是操作次数过于少,就应该去想特殊区间。
代码
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std
;
typedef long long ll
;
typedef unsigned long long ull
;
typedef pair
<int,int> pii
;
const ll INF
=0x3f3f3f3f3f3f3f3f;
const int maxn
=5e5+5,inf
=0x3f3f3f3f,mod
=19940417;
const double eps
=1e-10;
ll n
;
ll a
[maxn
];
signed main(){
scanf("%lld",&n
);
for(int i
=1;i
<=n
;i
++){
scanf("%lld",&a
[i
]);
}
if(n
==1){
printf("1 1\n0\n");
printf("1 1\n0\n");
printf("1 1\n%lld\n",-a
[1]);
}else{
printf("%d %lld\n",1,n
-1);
for(int i
=1;i
<=n
-1;i
++){
printf("%lld ",a
[i
]*(n
-1));
}
printf("\n");
printf("%lld %lld\n%lld\n",n
,n
,(n
-1)*a
[n
]);
printf("%d %lld\n",1,n
);
for(int i
=1;i
<=n
;i
++){
printf("%lld ",-n
*a
[i
]);
}
printf("\n");
}
return 0;
}