ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #753 (Div. 3) D. Blue-Red Permutation

2021-11-27 11:04:17  阅读:194  来源: 互联网

标签:753 Blue 元素 int blue Codeforces sort ++ red


原题链接

题目大意:给定一个数组a,他们每个元素具有red和blue中的其中一种,red属性的元素可以变成大于等于这个元素的任意数,blue属性的元素可以变成小于等于这个元素的任意数。现有一个数组a,问他们能否组成一个新数列包含1到n的所有数。

 

解题思路:

第一种:

创建一个桶数组,存入每个数的个数。对每个a元素进行判断,如果属性是blue,就从[ 1,a[i] ]中寻找空桶并放入,a[i]桶中的个数减一;如果属性是red,就从[ a[i],n ] 中寻找空桶并放入,a[i]桶中的个数减一。最后判断所有桶中的个数是否都为1。

第一种思路的问题在于a[i]的取值范围在[ -1e9,1e9 ] 之间,这样的数组开不出来,如果还要往这个思路继续发展,可以考虑用哈希表拉链法。

第二种:

讲属性为blue和red的元素分别push到两个数组里,因为具有blue属性的元素可以转变为比该元素值小的任意数,所以sort( < ) blue数组里的元素之后,排序后每个位置的元素如果出现比这个位置的序号 + 1小的元素,则这个问题是不能解决的,输出no;同样的道理,sort( > ) red 的数组里的元素值应该都小于n - 序号。

即:

 1 bool f = 1;
 2 sort(blue.begin(),blue.end());
 3 for(int i = 0;i < blue.size();i ++){
 4     if(blue[i] < i + 1)f = 0;
 5 }
 6 sort(red.begin(),red.end());
 7 reverse(red.begin(),red.end());
 8 for(int i = 0;i < red.size();i ++){
 9     if(red[i] > n - i)f = 0;
10 }

 

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define MP make_pair
 5 #define SZ(X) ((int)(X).size())
 6 typedef pair<int, int> PII;
 7 const int INF = 0x3f3f3f3f;
 8 const int N = 1e6 + 10;
 9 int T[N],l,r;
10 
11 int main(){
12     int  _;
13     scanf("%d",&_);
14     while(_--){
15         int n;
16         scanf("%d",&n);
17 
18         for(int i = 0;i < n;i ++){
19             scanf("%d",&T[i]);
20         }
21 
22         string s;
23         vector<int>blue,red;
24         
25         cin >> s;
26         
27         for(int i = 0;i < n;i ++){
28             if(s[i] == 'B'){
29                 blue.push_back(T[i]);
30             }
31             else {
32                 red.push_back(T[i]);
33             }
34 
35         }
36 
37         bool f = 1;
38         sort(blue.begin(),blue.end());
39         for(int i = 0;i < blue.size();i ++){
40             if(blue[i] < i + 1)f = 0;
41         }
42         sort(red.begin(),red.end());
43         reverse(red.begin(),red.end());
44         for(int i = 0;i < red.size();i ++){
45             if(red[i] > n - i)f = 0;
46         }
47 
48         printf(f?"YES\n":"NO\n");
49         blue.clear();
50         red.clear();
51     }
52     
53     return 0;
54 }

 

标签:753,Blue,元素,int,blue,Codeforces,sort,++,red
来源: https://www.cnblogs.com/Moniq/p/15611036.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有