题目:

题目大意: 给定一个数列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;}
}

Codeforces Round #842 (Div. 2)-C. Elemental Decompress相关推荐

  1. Codeforces Round #842 (Div. 2) 个人题解

    A. Greatest Convex 题意: 给t组数据,每组数据给定一个k,求出在[1,k)范围内,满足x!+(x-1)!%k==0的最大x 题解: 赛中可以通过观察法得知输出k-1即可,赛后可以尝 ...

  2. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  3. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  4. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  5. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  6. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  7. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  8. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  9. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

最新文章

  1. HTTP项目1.0 -- HTTP协议基础知识
  2. 一周内,在闲鱼上被疯狂转了 2 万次的 Linux 命令大全!!!
  3. node_modules中包不完整的解决方法
  4. python openstack究竟能干嘛_openstack是什么,能干什么
  5. Android中自定义xmlns
  6. 在Win2003中安装bind【部署智能DNS】
  7. 《大数据》编辑推荐 | 基于遥感大数据的信息提取技术综述
  8. Python 实现简单的爬虫
  9. 数据科学 IPython 笔记本 7.13 向量化字符串操作
  10. 怀旧服大脚插件未能从服务器,《魔兽世界怀旧服》大脚插件 安装方法使用教程...
  11. 算法列表-java实现
  12. 宠物医院管理系统(毕设)遇到的问题
  13. opencv——访问图像元素(imagedata widthstep)
  14. 获取 app 签名的方式汇总
  15. 批量将WORD转换成PDF文件
  16. Java奖学金评定系统设计与实现
  17. 损失函数MSE和MAE的区别以及如何选择
  18. kindle忘记密码怎么办_如果您的Kindle丢失或被盗怎么办
  19. 【JavaScript】时间日期,月日小于10的前面补0(新方法padStart)
  20. java nul 字符_Java字符串替换和NUL(NULL,ASCII 0)字符?

热门文章

  1. java实现一个socks5代理 一了解nio Selector的基本用法
  2. Linux下如何查看CPU信息, 包括位数和多核信息
  3. 爬虫反混淆入门--JS混淆之ob混淆
  4. Weblogic历史漏洞复现
  5. 1-2课:安静的程序,淘气的程序和编写程序
  6. JAVA动态代理实现
  7. 布隆过滤器(Bloom Filter)初探
  8. 艾永亮:产品创新都能有超额回报吗?理想美好,现实骨感
  9. C++中的try、catch跟throw以及传统处理异常的方法
  10. wma转换成mp3格式,wma转mp3快速完成