codeforces C. Multiples of Length

codeforces 专栏收录该内容
246 篇文章 0 订阅

在这里插入图片描述

题目

题意:

给你一个序列,你需要将这个序列进行三次操作使得 a i = 0 ( 1 ≤ i ≤ n ) a_i=0(1\leq i\leq n) ai=0(1in),在操作中你可以选定一个区间 ( l , r ) (l,r) (l,r),然后对于区间里面的每个数字你可以增加 ( r − l + 1 ) ∗ c i ( l ≤ i ≤ r ) (r-l+1) * c_i(l\leq i\leq r) (rl+1)ci(lir) c i c_i ci可以随意取,请你输出这三次操作中的 l , r , c 1 ∗ ( r − l + 1 ) . . . . . . l,r,c_1* (r-l+1)...... l,r,c1(rl+1)......

思路:

因为最后要为 0 , 0 , . . . . 0,0,.... 0,0,....,那么我们对于每一个 a i a_i ai,有 − a i ∗ x + a i ∗ ( x − 1 ) -a_i*x + a_i*(x-1) aix+ai(x1),我们需要将所有区间进行操作的话,那么此时的 x = n x = n x=n,所有就有第一次操作 a i = a i − a i ∗ n a_i=a_i -a_i * n ai=aiain,然后 a i = a i + a i ∗ ( n − 1 ) a_i=a_i + a_i * (n - 1) ai=ai+ai(n1),这样就可以让 ( 1 , n − 1 ) (1,n-1) (1,n1)的数字全部变成 0 0 0,我们还有一次机会,那么就让 a n = 0 a_n=0 an=0就行了。
需要注意的是当 n = 1 n=1 n=1的时候,需要特判一下。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <deque>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef vector<int> veci;
typedef vector<ll> vecl;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
template <class T>
inline void read(T &ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF) return ;
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1:1;
    ret = (c == '-') ? 0:(c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return ;
}
inline void outi(int x) {if (x > 9) outi(x / 10);putchar(x % 10 + '0');}
inline void outl(ll x) {if (x > 9) outl(x / 10);putchar(x % 10 + '0');}
const int maxn = 1e5 + 10;
ll a[maxn] = {0};
int main() {
    int n; read(n); for (int i = 1; i <= n; i++) read(a[i]);
    if (n == 1) {
        printf("1 1\n");
        printf("%lld", -a[1]);
        printf("\n1 1\n");
        printf("0");
        printf("\n1 1\n");
        printf("0");
    } else {
        printf("1 %d\n", n);
        for (int i = 1; i <= n; i++) printf("%lld ", -a[i] * n);
        printf("\n1 %d\n", n - 1);
        for (int i = 1; i < n; i++) printf("%lld ", a[i] * (n - 1));
        printf("\n%d %d\n", n, n);
        printf("%lld", a[n] * (n - 1));
    }
    return 0;
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值