C. Elemental Decompress codeforces 1768C
Problem - C - Codeforces
题目大意:给出一个长度为n的数组a,要求输出两个排列p,q,使得对于所有i属于1到n,都有max(pi,qi)=ai
1<=n<=2e5;1<=ai<=n
思路:我们可以发现如果一个数字在a中出现了两次,那么a中一个位置需要这个数字,另一个位置就是要b中是这个数字,那么我们统计a中数字出现的次数,如果是第一次出现就让p中对应位置的数字等于它,第二次出现时就让q中对应位置的数字等于它,然后我们如果这个位置更新的p,就要记录对这个位置pi的值和数组下标,作为以后构造b数组的依据,同时分别记录哪些数字没有在排列p,q,中现过,然后我们将这些没有访问过的值放入大根堆中,并将之前记录的对组数组按数值排序,从大到小遍历,并依次将大根堆中的数放入即可,最后再检验构造的两个数组是否满足排列的要求和最大值等于a的要求
//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int cnt[N];
int a[N], b[N];
pair<int,int> aa[N], bb[N];
int cnta[N], cntb[N];
int ma[N];
bool visa[N], visb[N];
int main()
{cin.tie(0);ios::sync_with_stdio(false);int t;cin >> t;while (t--){int n;cin >> n;bool flag = 1;for (int i = 1; i <= n; i++){a[i] = b[i] = 0;//p,q数组cnt[i] = 0;//统计a中数字出现的次数cnta[i] = cntb[i] = 0;//统计构造好的数组中数字出现的次数visa[i] = visb[i] = 0;//统计哪些数字已经被添加进了p,q中}int tota = 0, totb = 0;for (int i = 1; i <= n; i++){cin >> ma[i];cnt[ma[i]]++;if (cnt[ma[i]] == 1){//第一次出现的,放入p中a[i] = ma[i];bb[++totb] = make_pair(ma[i], i);//记录数值,下标visa[ma[i]] = 1;}else{b[i] = ma[i];aa[++tota] = make_pair(ma[i], i);visb[ma[i]] = 1;}}priority_queue<int>qa, qb;//存放没被添加过的数for (int i = 1; i <= n; i++){if (!visa[i])qa.push(i);if (!visb[i])qb.push(i);}sort(aa + 1, aa + 1 + tota);sort(bb + 1, bb + 1 + totb);//按数值排序for (int i = tota; i >= 1; i--){//从大到小遍历a[aa[i].second] = qa.top();//依次取出堆顶数,放入对应下标的位置上qa.pop();}for (int i = totb; i >= 1; i--){b[bb[i].second] = qb.top();qb.pop();}for (int i = 1; i <= n; i++){cnta[a[i]]++;//统计构造好的数组中每个数出现的次数cntb[b[i]]++;}for (int i = 1; i <= n; i++){if (cnta[i] != 1 || cntb[i] != 1||max(a[i],b[i])!=ma[i]){//每个数是否出现次数都是1,pi,qi最大值是都等于aiflag = 0;break;}}if (!flag){cout << "NO" << endl;continue;}cout << "YES" << endl;for (int i = 1; i <= n; i++){cout << a[i]<<" ";}cout << endl;for (int i = 1; i <= n; i++){cout << b[i] << " ";}cout << endl;}return 0;
}
C. Elemental Decompress codeforces 1768C相关推荐
- Codeforces Round #842 (Div. 2)-C. Elemental Decompress
题目: 题目大意: 给定一个数列t,你构造两个数列a和b,使得max(a[i],b[i])=t[i] 核心思想: 1.先根据给出的数组进行放置,优先放到a数组中,如果这个数已经在a数组中出现了,再去放 ...
- Codeforces Round #842 (Div. 2) 个人题解
A. Greatest Convex 题意: 给t组数据,每组数据给定一个k,求出在[1,k)范围内,满足x!+(x-1)!%k==0的最大x 题解: 赛中可以通过观察法得知输出k-1即可,赛后可以尝 ...
- CUGBACM22级暑假小学期训练-简单构造
CUGBACM22级暑假小学期训练-简单构造 这Typora打到9000多字就开始卡了,难绷 A - Gardener and the Capybaras (hard version) 题意:给一个字 ...
- CodeForces 375D Tree and Queries
传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...
- 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)
题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...
- 【codeforces 812C】Sagheer and Nubian Market
[题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...
- CodeForces 获得数据
针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...
- codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...
题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...
- CodeForces 595A
题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...
最新文章
- C++中nothrow的介绍及使用
- “N+虚拟现实行业高峰论坛”成功举办,共创VR美好未来
- opencv 创建图像_非艺术家的图像创建(OpenCV项目演练)
- html文件上传添加额外参数,bootstrap-fileinput组件在上传时传递额外参数
- Windows phone 应用开发[14]-调用WebBrowser
- android如何获取系统开机时间
- javascript animation lib greensock gsap介绍
- win10修复计算机选项,为你win10系统设置启动时按F10出现修复计算机选项的技巧...
- 塑源码是什么_源码是什么意思啊
- Photoshop(PS)制作牛年红包
- mscbsc移动通信论坛_中国移动5G资费被确认,流量低至1毛/G, 联通电信又被动,网友:良心价...
- linux运行jar文件Invalid or corrupt jarfile错误
- QT之Tableview
- 8b10b编码源码 matlab,8b/10b编码技术系列(一):Serdes、CDR、K码
- 【“工业大数据预测”系列】——第3篇:基于统计和信号的特征提取
- Android入门文档
- springJDBC报错NullPointException 解决问题记录
- 【领域驱动设计】四色建模法
- android设备显示电脑内容,安卓手机怎样用电脑查看记事本内容
- 【安全知识分享】夏季高温作业与应急知识(附下载)