Codeforces Round #842 (Div. 2)-C. Elemental Decompress

news2025/1/11 12:24:11

题目:
在这里插入图片描述
题目大意: 给定一个数列t,你构造两个数列a和b,使得max(a[i],b[i])=t[i]

核心思想: 1、先根据给出的数组进行放置,优先放到a数组中,如果这个数已经在a数组中出现了,再去放到b数组中
注意:a和b均为permutations ,也即1~n在a中必须出现,且只出现一次。
2、接下来先补全a数组:
把a数组中未出现的从大到小排序(用大根堆优先队列),记为t1
b数组中已经出现的从大到小排序(用sort排序)并记录下标,记为t2
因为这时两个都已经排好序了,最贪心的做法就是,把a最大的放到b最大的数所记录的下标位置 ,接着把a第二大的放到b第二大的数所记录的下标位置 ,接着把a第三大的放到b第三大的数所记录的下标位置……
这时一定是最优的,如果在放置的过程中,发现有个a中有个数比b的大,则之后的一定都比b的大,题目条件一定不满足
3、接下来先补全b数组(和上面类似):
把b数组中未出现的从大到小排序(用大根堆优先队列),记为t1
a数组中已经出现的从大到小排序(用sort排序),记为t2
如果能满足,则对于每一个t1[i],一定小于或等于t2[i]

AC代码:

#include <bits/stdc++.h>
using namespace std;
#define de(x) cout << x << " ";
#define sf(x) scanf("%d", &x);
#define Pu puts("");
#define ll long long
const int N = 2e5 + 10, M = 1e3 + 10;
int n, m, k, ans;
int a[N], b[N];
// a,b数组为最终的结果数组
bool st[N];
// st[i]为0时表示a数组i处已经放了,为1时表示b数组i处已经放了
bool v1[N], v2[N];
// v1[x]表示a数组中目前已经出现了x;v2[x]表示b数组中目前已经出现了x
struct E {
    int u, id;
} t[N];
int cn;
bool cmp(E a, E b) {
    return a.u > b.u;
}
int main() {
    int T;
    cin >> T;
    int x;
    priority_queue<int> q;
    while (T--) {
        cin >> n;
        memset(v1, 0, sizeof(v1));  // 初始化
        memset(v2, 0, sizeof(v2));
        memset(st, 0, sizeof(st));
        int f = 1;  // 记录这次数组是否能满足
        for (int i = 1; i <= n; i++) {
            sf(x);
            if (v1[x] == 0) {
                v1[x] = 1;

                a[i] = x;
                st[i] = 0;  // a数组i处已经放了
            } else {
                // 注意这里需要判断一下,如果某个数在a数组和b数组都已经放过了(即出现第三次)
                // 则此时一定不满足
                if (v2[x] == 1) {
                    f = 0;
                }
                v2[x] = 1;

                b[i] = x;
                st[i] = 1;  // b数组i处已经放了
            }
        }
        if (f == 0) {
            printf("NO\n");
            continue;
        }

        // 1、接下来补全a数组:
        while (q.size())
            q.pop();
        cn = 0;
        for (int i = 1; i <= n; i++) {
            if (v1[i] == 0) {
                q.push(i);  // 找出a中没有出现的,放到优先队列中
            }
            if (st[i] == 1) {
                t[++cn].id = i;  // 找出b中已经出现的,放到结构体中
                t[cn].u = b[i];  // 记录下标
            }
        }
        sort(t + 1, t + cn + 1, cmp);  // 结构体按照存储的数字从大到小排序
        for (int i = 1; i <= cn; i++) {
            if (q.top() > b[t[i].id]) {
                f = 0;
                break;  // 如果此时b中已经出现过的小于a中未出现过的,则一定不满足
            }
            a[t[i].id] = q.top();  // 否则,把当前队列中最大的数补到a中
            q.pop();
        }
        if (f == 0) {
            printf("NO\n");
            continue;
        }

        // 2、接下来补全b数组:
        while (q.size())
            q.pop();
        cn = 0;
        for (int i = 1; i <= n; i++) {
            if (v2[i] == 0) {
                q.push(i);
            }
            if (st[i] == 0) {
                t[++cn].id = i;
                t[cn].u = a[i];
            }
        }
        sort(t + 1, t + cn + 1, cmp);
        for (int i = 1; i <= cn; i++) {
            if (q.top() > a[t[i].id]) {
                f = 0;
                break;
            }
            b[t[i].id] = q.top();
            q.pop();
        }
        if (f == 0) {
            printf("NO\n");
            continue;
        }

        printf("YES\n");
        for (int i = 1; i <= n; i++) {
            printf("%d ", a[i]);
        }
        Pu;
        for (int i = 1; i <= n; i++) {
            printf("%d ", b[i]);
        }
        Pu;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/146147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sentinel的使用

一、sentinel控制台的使用1、sentinel控制台jar包地址&#xff1a;Releases alibaba/Sentinel GitHub账号密码都为sentinel控制台访问地址&#xff1a;http://localhost:80802、sentinel的maven坐标<dependency><groupId>com.alibaba.cloud</groupId><a…

Android基础入门教程——2.2 LinearLayout(线性布局)

总结图片2. weight权重白色占总数量的2份&#xff0c;绿色占总数的1份。<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.co…

树莓派最新版系统烧写和网络配置

树莓派笔记1.树莓派烧写篇2.树莓派WIFI配置篇3.树莓派ping外网4.树莓派git篇5.参考1.树莓派烧写篇 目前烧写最新版本32位系统(2022-09-22发布的)&#xff0c;默认移除了pi用户&#xff0c;没有用户就无法SSH登录(无屏幕)&#xff0c;建议使用raspberry pi imager烧写工具&…

通过USB转TTL串口下载stm32程序

文章目录前言一、硬件及其接线二、使用步骤1.主芯片STM32F103C8T6开发板2.转串口模块接线3.CH340驱动及安装方法4.CH340驱动及安装方法4.下载测试5.0.91寸OLED 接口演示例程前言 前期我们下载程序都是使用STlink进行下载的&#xff0c;现在给大家提供一种新的程序下载方法&…

5G小基站国产化超五成,美国芯片仅占1%,难怪美国芯片难卖了

日前日媒拆解中国某科技企业的5G小基站&#xff0c;发现它的中国零部件占比达到55%&#xff0c;而来自美国的零部件占比仅为1%&#xff0c;显示出这家企业在去美化取得了重大进展&#xff0c;如此也就能理解为何如今美国芯片难卖了。日媒指出该科技企业的5G小基站国产化零部件占…

动态规划 完全背包问题

目录 LintCode 炼码完全背包问题 【解法一】 【解法二】 完全背包问题 【解法一】 解释&#xff1a; 第一个for循环表示从第一个物品开始遍历 第二个for循环表示逆向 从背包容量为m时开始处理&#xff08;滚动数组&#xff09; 第三个for循环表示装入k个该物品&#xff0c;装…

【前端】Vue项目:旅游App-(9)city:固定tab栏、内容中显示数据

文章目录目标过程与代码Tab一直显示的两种方法方法1&#xff1a;fixed定位方法2&#xff1a;设置height和overflow-y&#xff08;效果不好&#xff09;content显示数据效果总代码city.vue相关参考目标 上一篇获取了服务器中的数据&#xff1a;【前端】Vue项目&#xff1a;旅游…

【数据结构】完全二叉树——啊堆堆堆

一、树概念及结构树的概念树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n > 0&#xff09;个有限节点组成的一个具有层次关系的集合。把它叫做树是因为他看起来像是一颗倒挂起来的树&#xff0c;也就是说它是根朝上&#xff0c;而叶子朝下的。-> 有一个特殊的…

Find My产品|Ember发布支持苹果Find My温控马克杯

在 CES2023 展会上&#xff0c;温控马克杯制造商 Ember 表示&#xff0c;计划在 2023 年 Q2 上市一款支持苹果 Find My 应用的全新 Travel Mug 2 马克杯。 这项新功能将使用户能够在 Find My 应用中追踪 Travel Mug 2 的位置&#xff0c;就像追踪iPhone、iPad、AirPods 或其他…

埃科光电在科创板IPO过会:拟募资11亿元,董宁为实际控制人

近日&#xff0c;上海证券交易所披露的信息显示&#xff0c;合肥埃科光电科技股份有限公司&#xff08;下称“埃科光电”获得科创板上市委会议通过。据贝多财经了解&#xff0c;埃科光电于2022年6月22日在科创板提交招股书&#xff0c;并于12月29日递交招股书&#xff08;上会稿…

图像分割笔记

图像分割笔记 目标&#xff1a; 实现图像中多个物体的分割&#xff0c;多个物体的标注方式为0,1,2,3,0表示背景&#xff0c;1表示一种物体&#xff0c;2表示另一种物体&#xff0c;假设我们现在的分割任务里面有5个目标需要&#xff0c;如肺叶分割&#xff0c;5个肺叶的标注方…

飞书开放平台-全新消息卡片搭建工具

前言你还在为需要手撕 JSON 代码而烦恼吗&#xff1f;消息卡片搭建工具全新升级&#xff0c;为你带来更优雅的卡片创作体验&#xff1a;&#x1f31f; 卡片编辑&#xff1a;纯可视化操作编辑消息卡片&#xff0c;再也不用碰代码&#x1f31f; 我的卡片&#xff1a;一键保存卡片…

Vue3 Composition API

文章目录p15 Vue3 Composition APIMixin全局混入options API的弊端认识Componsition APIsetup函数的参数setup不可以使用thisReactive APIrefreadonlyp16 Composition API(二)toRefscomputedwatchEffect在setup中使用refwatchp15 Vue3 Composition API Mixin 全局混入 、 opti…

使用正则表达式删除注释

以下摘自某网友来信&#xff1a; 难点 Javascript 不支持点号匹配换行符, 因此无法直接进行多行匹配处理前面没有 http: 的 //, 当然要用否定前瞻( negative lookbehine)了:(?<!http:)\/\/. 可惜 javascript 不支持 思路 关于多行匹配 这个问题, 之前我已经说过, 要点…

多线程初阶(四)定时器及线程池

目录 前言&#xff1a; 定时器 使用标准库中定时器 模拟实现定时器 线程池 使用标准库中的线程池 代码实现 ThreadPoolExecutor类介绍 构造方法参数介绍 拒绝策略介绍 模拟实现线程池 代码实现 提出问题 小结&#xff1a; 前言&#xff1a; 这篇文章同上一篇文章…

简单实现Java定时器

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【JavaEE】 &#x1f432;&#x1f432;本篇内容&#xff1a;自己实现Java定时器 &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编程小白&…

【手写 Vue2.x 源码】第九篇 - 对象数据变化的观测情况

一&#xff0c;前言 上篇&#xff0c;主要介绍了数组深层观测的实现&#xff0c;核心几个点如下&#xff1a; 最初仅对数组类型进行了原型方法重写&#xff0c;并未进行递归处理&#xff0c;所以&#xff0c;当时仅实现了数组的单层劫持&#xff1b; 通过对数组进行 observe…

二、Gtk4-GtkApplication and GtkApplicationWindow

1 GtkApplication 1.1 GtkApplication and g_application_run 人们编写编程代码来开发应用程序。什么是应用程序?应用程序是使用库运行的软件&#xff0c;其中包括操作系统、框架等。在GTK 4编程中&#xff0c;GTK应用程序是使用GTK库运行的程序(或可执行程序)。 编写GtkAp…

信创改造,你了解多少?

最近&#xff0c;“信创”一词在IT圈瞬间爆火&#xff0c;那什么是信创&#xff1f;又能带来哪些突破性的改变&#xff1f;跟随佑友一起来详细了解一下… 信创的来源 2016年3月4日&#xff0c;24家专业从事软硬件关键技术研究及应用的国内单位&#xff0c;共同发起成立了一个非…

分布式链路追踪-skywalking入门体验

背景 旁友&#xff0c;你的线上服务是不是偶尔来个超时&#xff0c;或者突然抖动一下&#xff0c;造成用户一堆反馈投诉。然后你费了九牛二虎之力&#xff0c;查了一圈圈代码和日志才总算定位到问题原因了。或者公司内部有链路追踪系统&#xff0c;虽然可以很轻松地通过监控判…