博客园 首页 私信博主 显示目录 隐藏目录 管理

题解 CF1396A

CF1397C

\(CF round 666\) 好神仙

题目大意

给定你一个长度为 \(n\) 的序列。

你可以进行 \(3\) 次操作。

每次可以选定一个区间,把这个区间的每个数都加上 \(len \times x\)

\(1.\)\(x\) 是整数(可以为负)

\(2.\) 对于区间的每个数可以取不同的 \(x\)

问你最后方案是什么。

输出格式

\(3\) 段,每一段有 \(2\) 行。

第一行 \(2\) 个数表示区间 \(l\) ~ \(r\)

第二行 \(r - l + 1\) 个数,表示加上的数,即 \(len \times x\)

题解

考虑第一次我们只分区间 \(1 ~ 1\) ,这样可以确保它变为 \(0\)

第二次我们想把区间 \(2 ~ n\) 的所有元素都变成 \(n\) 的倍数。

对于 \(a_i\) 我们可以把它加上一个 \(n - 1\) 的倍数 :\((n - 1) * a_i\)

那么新的 \(a_i\) 会变成 \(a_i + (n - 1) * a_i\) 也就是 \(a_i * n\) 那么就一定是 \(n\) 的倍数。

而且这个对于所有的 \(i \in [2, n]\) 都成立

最后就把 \(1 ~ n\) 都减去 \(a_i\) 就行了,因为 \(a_i\) 已经都是 \(n\) 的倍数了。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <bits/stdc++.h>
#define maxn 100010
#define ls x << 1
#define rs x << 1 | 1
#define inf 0x3f3f3f3f
#define inc(i) (++ (i))
#define dec(i) (-- (i))
#define mid ((l + r) >> 1)
#define int long long
#define XRZ 1000000003
#define debug() puts("XRZ TXDY");
#define mem(i, x) memset(i, x, sizeof(i));
#define Next(i, u) for(register int i = head[u]; i ; i = e[i].nxt)
#define file(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout);
#define Rep(i, a, b) for(register int i = (a) , i##Limit = (b) ; i <= i##Limit ; inc(i))
#define Dep(i, a, b) for(register int i = (a) , i##Limit = (b) ; i >= i##Limit ; dec(i))
int dx[10] = {1, -1, 0, 0};
int dy[10] = {0, 0, 1, -1};
using namespace std;
inline int read() {
    register int x = 0, f = 1; register char c = getchar();
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
    return x * f;
} int a[maxn];
signed main() {
      int n = read();
      Rep(i, 1, n) a[i] = read();
      if(n == 1) {
            printf("1 1\n0\n");
            printf("1 1\n0\n");
            printf("1 1\n%d", -a[1]);
      }
      else if(n == 2) {
            printf("1 1\n%d\n", -a[1]);
            printf("2 2\n%d\n", -a[2]);
            printf("1 1\n0");
      }
      else if(n == 3) {
            printf("1 1\n%d\n", -a[1]);
            printf("2 2\n%d\n", -a[2]);
            printf("3 3\n%d\n", -a[3]);
      }
      else {
            printf("1 1\n%lld\n2 %lld\n", 0 - a[1], n);
            Rep(i, 2, n) {
                  printf("%lld ", a[i] * (n - 1));
            }
            printf("\n1 %lld\n0 ", n);
            Rep(i, 2, n) printf("%lld ", 0 - a[i] * n);
      }
      return 0;
}
posted @ 2020-10-18 11:18  Flash_plus  阅读(87)  评论(0编辑  收藏  举报