<span>题解 CF1396A</span>

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;
}
全部评论

相关推荐

叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务