【构造】CF1798 D

news/2024/7/4 8:15:53

Problem - D - Codeforces

题意:

思路:

首先如果 a 全是 00,那么显然无解。

否则考虑从左到右构造新数列,维护新数列的前缀和 s。

  • 如果 s≥0,则在剩余未加入的数中随便选择一个非正数添加到新数列末尾。
  • 如果 s<0,则在剩余未加入的数中随便选择一个负数添加到新数列末尾。

因为保证了数列之和为 0,所以当 s≥0 时,你总能找到还没添加的非正数,同理第二种情况你也总能找到未添加的正数。

考虑这样构造的正确性:注意到 min ai​ ≤ s ≤ max ai​。这是因为每次总会添加一个和 s 异号的数。当 s≥0 时,能找到的最小数也是 min ai​,则新的前缀和 's′ 满足 s′≥s+min ai​​。类似可以证明s≤max ai​。

而任何区间的和都可以写成两个前缀和相减的形式。设 si​ 是长度为 i 的前缀和,则 ∣∑i=lr​ai​∣=∣sr​−sl​∣≤max ai​−min ai​。任何区间都满足这个限制,自然区间和绝对值的最大值也满足这个限制。正确性得证。

 

Code:

#include <bits/stdc++.h>

using i64 = long long;

constexpr int N = 2e5 + 10;
constexpr int mod = 1e9 + 7;

void solve() {
    int n;
    std::cin >> n;
    
    std::vector<int> a(n);
    int ok = 0;
    for (int i = 0; i < n; i ++) {
        std::cin >> a[i];
        if (a[i] != 0) ok = 1;
    }

    if (!ok) {
        std::cout << "No" << "\n";
        return;
    }
    std::cout << "Yes" << "\n";

    int l = 0, r = n - 1;
    i64 s = 0;
    std::sort(a.begin(), a.end());

    std::vector<int> ans;
    while(l <= r) {
        if (s <= 0) {
            s += a[r];
            ans.push_back(a[r --]);
        }else {
            s += a[l];
            ans.push_back(a[l ++]);
        }
    }
    for (int i = 0; i < ans.size(); i ++) {
        std::cout << ans[i] << " \n" [i == ans.size() - 1];
    }
}
signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t = 1;
    std::cin >> t;
    while(t --) {
        solve();
    }
    return 0;
}


http://www.niftyadmin.cn/n/4924361.html

相关文章

Linux root用户执行修改密码命令,提示 Permission denied

问题 linux系统中&#xff08;ubuntu20&#xff09;&#xff0c;root用户下执行passwd命令&#xff0c;提示 passwd: Permission denied &#xff0c;如下图&#xff1a; 排查 1.执行 ll /usr/bin/passwd &#xff0c;查看文件权限是否正确&#xff0c;正常情况是 -rwsr-xr…

linux 内存 - KO内存占用

说明 KO(kernel module)占用的内存分为两部分&#xff1a; 静态占用 &#xff1a;ko insmod时系统固定分配的内存。动态申请 &#xff1a;代码中动态申请的内存&#xff0c;由于申请方式不同&#xff0c;统计的方式也可能不同&#xff0c;例如&#xff1a;使用vmalloc和kmall…

Netty:查看ByteBuf的实现类

io.netty.buffer.ByteBuf是一个抽象类&#xff0c;我们看看它最终的实现类。实现类有多个&#xff0c;具体用的是哪个实现类&#xff0c;跟分配ByteBuf的方式有关。 作为举例&#xff0c;分别用Unpooled和ByteBufAllocator.DEFAUL来分配一个ByteBuf。 package com.thb;import …

jQuery知识

DOM知识 alert(我是弹窗); prompt(弹窗输入);Dom元素节点获取 方式一&#xff1a;通过 id 获取 一个 元素节点&#xff08;为什么是一个呢&#xff1f;因为 id 是唯一的&#xff09; var div1 document.getElementById("box1"); 方式二&#xff1a;通过 标签名 获…

什么是行级锁和表级锁

行级锁和表级锁是数据库中常见的两种锁机制&#xff0c;用于在多个事务并发访问数据库时控制数据的访问权限和并发操作。 行级锁&#xff08;Row-Level Locking&#xff09;&#xff1a; 行级锁是指在数据库表中对每一行数据进行锁定&#xff0c;只有被锁定的行才不能被其他事…

Vue中的的通信方式有几种?隔代组件的通信你用那种方式解决?

props/$emit 适用父子组件通信 ref与parent/children适用父子组件通信 attrs/listeners,provide/inject 适用于隔代组件通信 vuex,EventBus(事件总线) 适用于父子、隔代、兄弟组件通信 slot插槽方式 attrs实例 父组件&#xff08;这时候我们传了两个参数title和type&…

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv5配置了5种不同大小的网络模型&#xff0c;分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x&#xff0c;其中YOLOv5n是网络深度和宽度最小但检测速度最快的模型&#xff0c;其他4种模型都是在YOLOv5n的基础上不断…

Java并发 | 常见线程安全容器

文章目录 简介一、Hash表&#x1f6a3;1、ConcurrentHashMap1.1 内部实现原理1.2 并发操作方法1.3 ConcurrentHashMap与Hashtable的比较 二、集合&#x1f6a3;2、CopyOnWriteArrayList2.1 内部实现原理2.2 Copy-On-Write(COW)设计思想2.3 实操 三、Map&#x1f6a3;3、Concurr…