Codeforces Round #582 (Div. 3) F. Unstable String Sort
题意:
你需要输出一个长度为n的字符序列(由小写字母组成),且这个字符串中至少包含k个不同的字符。另外题目还有要求:给你两个长度为p和q的序列,设字符序列存在s中
那么就会有s[Pi]<=s[P(i+1)] (i<p)
s[Qi]<=s[Q(i+1)] (i<q) 如果你能找出来满足这些条件的字符串s,就输出YES和s,否则输出NO
这会得到一个非递减字符串
题解:
因为最后的结果是一个非递减字符串,那么肯定对整个字符串s,会有s[i]<=s[i+1] (0<=i<strlen(s)-1)
那么这样的话,只有当Pi>P(i+1)或者Qi>Q(i+1)的时候,才会影响字符串在[P(i+1),Pi]或者[Q(i+1),Qi]的取值,这一段区间内的字符肯定要相等
因为题目上要求字符串s至少要有k个不同的字符,所以只要不遇到上面这种情况,那么每一个位置的字符都要比上一个字符大(我们这里是先用a,再用b等等)
所以我们只需要注意Pi>P(i+1)或者Qi>Q(i+1)这种区间就可以了
想到这里正解就出来了,对每个P[i]找到最小的jjj,使得P[j]的位置在Q中位于P[i]的后方(为了方便,认为i自身也是一个合法的jjj),那么P[j..i]就必须同字母。如果两个同字母段相交,那么合并起来的整一段都必须同字母,因此处理完所有字母段再扫一遍,把相交的同字母段合并。最后看看有没有k段,贪心地让不同字母段用不同的字母即可,复杂度O(n)
如果用到了字符z,但是序列s还没有写完,那么剩下的全部位置输出z
如果抛开题目去看,你输出一个长为n的序列,如果这个序列中只包含一个字符,那么除了不满足k个不同字符的要求外,其他条件都满足
还有一种方法,P[i]]向P[i−1]连边,Q[i]则Q[i−1]连边,边(x,y)就表示x位置上的字母必须不小于y位置,那么一个强连通分量的所有位置必须同字母,一遍tarjan即可
我原来写了一个,但是过于暴力,T了T_T
T代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<vector>
6 #include<queue>
7 using namespace std;
8 const int maxn=2e5+5;
9 const int INF=0x3f3f3f3f;
10 typedef long long ll;
11 //vector<int>w[maxn];
12 int a[maxn],b[maxn],v[maxn],w[maxn];
13 int main()
14 {
15 int n,k;
16 //memset(v,INF,sizeof(v));
17 scanf("%d%d",&n,&k);
18 for(int i=1; i<=n; ++i)
19 {
20 scanf("%d",&a[i]);
21 }
22 for(int i=1; i<=n; ++i)
23 scanf("%d",&b[i]);
24 for(int i=1; i<n; ++i)
25 {
26 if(a[i+1]<a[i])
27 {
28 v[a[i+1]]=max(v[a[i+1]],a[i]);
29 }
30 }
31 for(int i=1; i<n; ++i)
32 {
33 if(b[i+1]<b[i])
34 {
35 v[b[i+1]]=max(v[b[i+1]],b[i]);
36 }
37 }
38 int ans=0,flag=0;
39 for(int i=1; i<=n; ++i)
40 {
41 if(w[i]==0)
42 {
43 if(v[i]==0)
44 {
45 w[i]='a'+ans++;
46 }
47 else
48 {
49 for(int j=i; j<=v[i]; ++j)
50 w[j]='a'+ans;
51 ans++;
52 //i=v[i];
53 }
54 }
55 else
56 {
57 if(v[i]==0)
58 {
59 continue;
60 }
61 else
62 {
63 for(int j=i+1; j<=v[i]; ++j)
64 w[j]=w[i];
65 //i=v[i];
66 }
67 }
68 }
69 if(ans<k) flag=1;
70 if(!flag)
71 {
72 printf("YES\n");
73 for(int i=1; i<=n; ++i)
74 {
75 if(i!=n) printf("%c",w[i]);
76 else printf("%c\n",w[i]);
77 }
78 }
79 else
80 {
81 printf("NO\n");
82 }
83 return 0;
84 }
正解:
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<queue>
5 #include<cmath>
6 #include<string.h>
7 #include<set>
8 #define LL long long
9 using namespace std;
10 LL read( )
11 {
12 LL sum=0;char c=getchar( );bool f=0;
13 while(c<'0' || c>'9') {if(c=='-') f=1;c=getchar( );}
14 while(c>='0' && c<='9') {sum=sum*10+c-'0';c=getchar( );}
15 if(f) return -sum;
16 return sum;
17 }
18 const int N=200005;
19 int n,m,P[N],Q[N],pos[N],L[N],bel[N];
20 char ans[N];
21 int main( )
22 {
23 int i,j,k;
24 n=read( );m=read( );
25 for(i=1;i<=n;i++) P[i]=read( ),pos[P[i]]=i;
26 for(i=1;i<=n;i++) Q[i]=read( );
27 for(k=n,i=n;i>=1;i--) j=pos[Q[i]],k=min(k,j),L[j]=k;
28 for(j=1,k=n,i=n;i>=1;i--)
29 {
30 k=min(k,L[i]);bel[i]=j;
31 if(k==i) j++;
32 }
33 if(bel[1]<m) {puts("NO");return 0;}
34 puts("YES");
35 for(j=-1,i=1;i<=n;i++)
36 {
37 if(bel[i]!=bel[i-1]) j++;
38 ans[P[i]]='a'+min(25,j);
39 }
40 for(i=1;i<=n;i++) printf("%c",ans[i]);
41 return 0;
42 }
Codeforces Round #582 (Div. 3) F. Unstable String Sort的更多相关文章
- Codeforces Round #485 (Div. 2) F. AND Graph
Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...
- Codeforces Round #501 (Div. 3) F. Bracket Substring
题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...
- 贪心 Codeforces Round #303 (Div. 2) B. Equidistant String
题目传送门 /* 题意:找到一个字符串p,使得它和s,t的不同的总个数相同 贪心:假设p与s相同,奇偶变换赋值,当是偶数,则有答案 */ #include <cstdio> #includ ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Codeforces Round #582 (Div. 3)-G. Path Queries-并查集
Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...
- Codeforces Round #376 (Div. 2)F. Video Cards(前缀和)
题目链接:http://codeforces.com/contest/731/problem/F 题意:有n个数,从里面选出来一个作为第一个,然后剩下的数要满足是这个数的倍数,如果不是,只能减小为他的 ...
- Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)
题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...
- Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)
题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...
随机推荐
- 机器学习算法-logistic回归算法
Logistic回归算法调试 一.算法原理 Logistic回归算法是一种优化算法,主要用用于只有两种标签的分类问题.其原理为对一些数据点用一条直线去拟合,对数据集进行划分.从广义上来讲这也是一种多元 ...
- html2canvas canvas webgl 截图透明空🤣
1. React用这个插件html2canvas完成div截图功能,div里面嵌套canvas,返回base64是透明图片. html2canvas(document.getElementById(& ...
- L(kali)A(apache)M(mysql)P(php)环境+wordpress站点搭建
一:LAMP环境配置 首先LAMP(linux+apache+mysql+php)即为本次搭建网站所需的环境,由于本次使用的debian衍生版kali版本自带lamp,因此只要在服务器上启动相应服务既 ...
- Celery--短信与邮件
1 Celery 实现短信--邮件 1.1 容联云-短信 from ronglian_sms_sdk import SmsSDK accountSid = '8a216da8757784cd01759 ...
- SDUST数据结构 - chap5 数组与广义表
选择题:
- vagrant up报错【io.rb:32:in `encode': "\x95" followed by "\"" on GBK (Encoding::InvalidByteSequenceError)】
vagrant up报错[io.rb:32:in `encode': "\x95" followed by """ on GBK (Encoding: ...
- 词嵌入之GloVe
什么是GloVe GloVe(Global Vectors for Word Representation)是一个基于全局词频统计(count-based & overall statisti ...
- 使用 tke-autoscaling-placeholder 实现秒级弹性伸缩
背景 当 TKE 集群配置了节点池并启用了弹性伸缩,在节点资源不够时可以触发节点的自动扩容 (自动买机器并加入集群),但这个扩容流程需要一定的时间才能完成,在一些流量突高的场景,这个扩容速度可能会显得 ...
- ovs-ofctl命令
用于监控和管理 OpenFlow 交换机. 1. 交换机管理命令 查看交换机信息: ovs-ofctl show s1 查看交换机流表: ovs-ofctl dump-tables s1 查看端口信 ...
- centos7 centos-home 磁盘空间转移至centos-root下
亲测可用,转载是为了记录,方便下次自己查看,如后朋友看到,请去查看作者原文,支持原创!!! 原文连接:https://www.cnblogs.com/renshengruxi/p/11782980.h ...