Codeforces Round #666 (Div. 2) C. Multiples of Length题解(构造)

tech2023-07-27  119

题目链接

题目大意

给你一个长为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; }
最新回复(0)