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

题目链接

题目大意

给你一个长为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;
}

猜你喜欢

转载自blog.csdn.net/m0_46209312/article/details/108384284