± Increasing Sequence

题目来源:AtCoder Regular Contest 153的C

https://atcoder.jp/contests/arc153/tasks/arc153_c

题意:给一个数列An,这个数列只包含-1和1,构造一个数列Bn,使得AiBi的总和等于0,如果能构造出来就输出Yes并输出数列Bn,否则就输出No

(构造题,说实话场上是几乎没有看这个题的,就扫了一眼然后发现学校的几个大佬都没过这个题就直接放弃了。占个坑先,也不知道以后会不会用到这个思路了。)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

inline int in() {
    int x;
    scanf("%d", &x);
    return x;
}
const int N = 2e5 + 5;
int n, a[N];
ll b[N];
/* 1  1  1  1  1 -1
-6 -5 -4 -3 -2 -1
-6 -5 -4 16 17 18 
-6-5-4-3-2+1=-19
-6-5-4-3+19-2+1=-6-5-4+16-2+1=0
-6-5-4+16=2-1=17-18
一对1 -1,就产生一个-1
一对-1 1,就产生一个1
1 -1 -1 1就会抵消
如果不能抵消,那么就得靠一个数把这个差距给消除掉
*/
int main() {
    n = in();
    for (int i = 1; i <= n; i++)
        a[i] = in();
    ll sum = 0;
    for (int i = 1; i <= n; i++)
        b[i] = i - 1e6, sum += a[i] * b[i];
    for (int i = n, s = 0; i >= 1; i--) {
        s += a[i];
        if ((s == -1 && sum > 0) || (s == 1 && sum < 0)) {
    //对称着写
            for (int j = i; j <= n; j++)
                b[j] += abs(sum);
            sum = 0;
            break;
        }
    }
    if (sum != 0) {
        puts("No");
        return 0;
    }
    puts("Yes");
    for (int i = 1; i <= n; i++)
        printf("%lld ", b[i]);
    puts("");
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值