Codeforces Round #842 (Div. 2)-C. Elemental Decompress
题目:
题目大意: 给定一个数列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相关推荐
- Codeforces Round #842 (Div. 2) 个人题解
A. Greatest Convex 题意: 给t组数据,每组数据给定一个k,求出在[1,k)范围内,满足x!+(x-1)!%k==0的最大x 题解: 赛中可以通过观察法得知输出k-1即可,赛后可以尝 ...
- Codeforces Round #506 (Div. 3)
Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...
- 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 ...
- 构造 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 的例子可以 ...
- Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...
- Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...
- Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...
- Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...
- Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...
最新文章
- HTTP项目1.0 -- HTTP协议基础知识
- 一周内,在闲鱼上被疯狂转了 2 万次的 Linux 命令大全!!!
- node_modules中包不完整的解决方法
- python openstack究竟能干嘛_openstack是什么,能干什么
- Android中自定义xmlns
- 在Win2003中安装bind【部署智能DNS】
- 《大数据》编辑推荐 | 基于遥感大数据的信息提取技术综述
- Python 实现简单的爬虫
- 数据科学 IPython 笔记本 7.13 向量化字符串操作
- 怀旧服大脚插件未能从服务器,《魔兽世界怀旧服》大脚插件 安装方法使用教程...
- 算法列表-java实现
- 宠物医院管理系统(毕设)遇到的问题
- opencv——访问图像元素(imagedata widthstep)
- 获取 app 签名的方式汇总
- 批量将WORD转换成PDF文件
- Java奖学金评定系统设计与实现
- 损失函数MSE和MAE的区别以及如何选择
- kindle忘记密码怎么办_如果您的Kindle丢失或被盗怎么办
- 【JavaScript】时间日期,月日小于10的前面补0(新方法padStart)
- java nul 字符_Java字符串替换和NUL(NULL,ASCII 0)字符?