传送门

题意:

你需要输出一个长度为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的更多相关文章

  1. Codeforces Round #485 (Div. 2) F. AND Graph

    Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...

  2. Codeforces Round #486 (Div. 3) F. Rain and Umbrellas

    Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...

  3. Codeforces Round #501 (Div. 3) F. Bracket Substring

    题目链接 Codeforces Round #501 (Div. 3) F. Bracket Substring 题解 官方题解 http://codeforces.com/blog/entry/60 ...

  4. 贪心 Codeforces Round #303 (Div. 2) B. Equidistant String

    题目传送门 /* 题意:找到一个字符串p,使得它和s,t的不同的总个数相同 贪心:假设p与s相同,奇偶变换赋值,当是偶数,则有答案 */ #include <cstdio> #includ ...

  5. Codeforces Round #499 (Div. 1) F. Tree

    Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...

  6. Codeforces Round #582 (Div. 3)-G. Path Queries-并查集

    Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...

  7. Codeforces Round #376 (Div. 2)F. Video Cards(前缀和)

    题目链接:http://codeforces.com/contest/731/problem/F 题意:有n个数,从里面选出来一个作为第一个,然后剩下的数要满足是这个数的倍数,如果不是,只能减小为他的 ...

  8. Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)

    题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...

  9. Codeforces Round #479 (Div. 3) F. Consecutive Subsequence (简单dp)

    题目:https://codeforces.com/problemset/problem/977/F 题意:一个序列,求最长单调递增子序列,但是有一个要求是中间差值都是1 思路:dp,O(n)复杂度, ...

随机推荐

  1. 攻防世界 - Web(三)

    PHP2: 1.进入页面,进行抓包或后台扫描都没有什么发现,然后网上查一波wp,发现是关于.phps文件,进入index.phps,弹出一段代码,查看源代码, <?php if("ad ...

  2. C语言补码(C语言学习笔记)

    记录 在学习C语言数据范围时了解到了补码的概念,记录一下什么是补码,补码怎么运算的 运算 原文链接:https://www.cnblogs.com/lsgsanxiao/p/5113305.html ...

  3. 修改conda和pip源

    修改conda源为中科大源 Windows修改C:\Users\user(user替换为当前登陆系统的用户)目录下的.condarc文件 Linux修改家目录下的.condarc文件 channels ...

  4. SAP client锁定

    今天发现一个函数可以锁定SAP CLIENT . SCCR_LOCK_CLIENT 参数是client号码. 还可以通过事物SU10批量锁定用户登陆client

  5. layui表格数据统计

    //执行一个 table 实例 table.render({ elem: '#demo' ,height: 420 ,url: '/demo/table/user/' //数据接口 ,title: ' ...

  6. 高效率同步降压变换器,24V转3.3V降压芯片

    PW2312是一个高频,同步,整流,降压,开关模式转换器与内部功率MOSFET.它提供了一个非常紧凑的解决方案,以实现1.5A的峰值输出电流在广泛的输入电源范围内,具有良好的负载和线路调节. PW23 ...

  7. 十一、UART&TTY驱动

    Linux系统中UART驱动和TTY驱动两者有着紧密的关系,它们不像I2C和SPI驱动是单独一个模块,分析时应当将它们看成一个整体来分析.UART驱动部分依赖于硬件平台,而TTY驱动和具体的平台无关. ...

  8. STP 根桥、根端口、指定端口是如何选举的

    学习HCIA过程中,对交换机的根桥.跟端口以及指定端口选举有些迷糊,也度娘了一番,总觉得一部分人解释的不够全面精细.通过仔细研究最终有了自己的理解,分享给大家,如果纰漏,欢迎指正. STP收敛过程: ...

  9. chain issues incorrect order,EXtra certs,Contains anchor

    背景: 下载颁发下来的ssl证书安装好之后网站正常显示安全,但是通过ssl证书网站去检测报错误:chain issues incorrect order,EXtra certs,Contains an ...

  10. Python+Selenium+Unittest实现PO模式web自动化框架(3)

    1.Outputs目录下的具体目录功能 2.logs目录 logs目录是用于存放log日志的一个目录. 2.reports目录 reports目录是用于存放测试报告的. 3.screenshots目录 ...