/*
有向边(pi,pi+1),形成链后进行dfs,求出dfs序
一个联通块内的元素必须是同一个字符,如果最后的联通块个数<k,说明不行
*/
#include<bits/stdc++.h>
using namespace std;
#define N 200005
int n,k,p[N],q[N]; int rk1[N],rk2[N]; struct Node{int id,rk;}a[N],b[N];
int cmp1(Node a,Node b){return a.rk<b.rk;}
int cmp2(Node a,Node b){return a.rk<b.rk;} int F[N];
int find(int x){
return F[x]==x?x:F[x]=find(F[x]);
}
void bing(int u,int v){
int f1=find(u),f2=find(v);
if(f1==f2)return;
else F[f1]=f2;
}
int ans[N];
int main(){
cin>>n>>k;
for(int i=;i<=n;i++)cin>>p[i];
for(int i=;i<=n;i++)cin>>q[i];
for(int i=;i<=n;i++)rk1[p[i]]=i,rk2[q[i]]=i; for(int i=;i<=n;i++)a[i].id=i,a[i].rk=rk1[i];
sort(a+,a++n,cmp1);//按照rk1升序排序 for(int i=;i<=n;i++)b[i].id=i,b[i].rk=rk2[i];
sort(b+,b++n,cmp2);//按照rk2升序排列 for(int i=;i<=n;i++)F[i]=i; int pos=,vis[N];
memset(vis,,sizeof vis);
for(int i=;i<=n;i++)if(!vis[b[i].id]){
//直到a[pos].id==b[i].id
pos=max(pos,i);
while(a[pos].id!=b[i].id){
vis[a[pos].id]=;
bing(b[i].id,a[pos].id);
pos++;
}
vis[b[i].id]=;
}
//求联通块个数联通块
int tot;
for(int i=;i<=n;i++){
find(i);
if(F[i]==i)tot++;
}
if(tot<k){puts("NO");return ;} //染色
memset(vis,,sizeof vis);
int c=;
for(int i=;i<=n;i++){
if(!vis[F[a[i].id]]){
ans[a[i].id]=min(,++c);
vis[F[a[i].id]]=;
}
else ans[a[i].id]=min(,c);
} puts("YES");
for(int i=;i<=n;i++)
cout<<(char)(ans[i]+'a'-);
puts("");
}

排序+并查集——cf1213F的更多相关文章

  1. ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线

    hdu 1811 Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  2. HDU 1811 拓扑排序 并查集

    有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...

  3. 拓扑排序 - 并查集 - Rank of Tetris

    Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球 ...

  4. LA 4255 (拓扑排序 并查集) Guess

    设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...

  5. Rank of Tetris(hdu1811拓扑排序+并查集)

    题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...

  6. codeforces Codeforces Round #345 (Div. 1) C. Table Compression 排序+并查集

    C. Table Compression Little Petya is now fond of data compression algorithms. He has already studied ...

  7. HDU 1811 Rank of Tetris 拓补排序+并查集

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [ ...

  8. Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)

    Problem   Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...

  9. LA4255/UVa1423 Guess 拓扑排序 并查集

    评分稍微有一点过分..不过这个题目确确实实很厉害,对思维训练也非常有帮助. 按照套路,我们把矩阵中的子段和化为前缀和相减的形式.题目就变成了给定一些前缀和之间的大小关系,让你构造一组可行的数据.这个东 ...

随机推荐

  1. shell脚本相关关系、浮点、循环

    将一堆命令放在脚本里变成可执行脚本执行: 脚本编写,文件名为.sh,获取hostname的主机名 系统变量: Env:查看系统变量 Set :打印所有变量可以和grep和用 Export path:定 ...

  2. 【从0到1,搭建Spring Boot+RESTful API+Shiro+Mybatis+SQLServer权限系统】03、创建RESTful API,并统一处理返回值

    本节应用Spring对RESTful的支持,使用了如@RestController等注解实现RESTful控制器. 如果对Spring中的RESTful不太明白,请查看相关书籍 1.创建一个数据对象, ...

  3. MySQL timestampdiff 和 timestampadd 的用法

    在应用时,经常要使用这两个函数TIMESTAMPDIFF和TIMESTAMPADD. 一,TIMESTAMPDIFF 语法: TIMESTAMPDIFF(interval,datetime_expr1 ...

  4. 7.使用mysql_export监控mysql

    ok,docker监控,宿主机CPU.磁盘.网络.内存监控我们都已讲过,是时候讲一波mysql监控了.本次mysql部署在客户端. 架构 客户端 MySql安装 ##下载mysql的repo源: [r ...

  5. shell 读取配置文件的用法

    https://blog.csdn.net/qq_36684665/article/details/81134179 亲测有用!

  6. JFreeChart教程

    图表是信息的图形表示.有可用的各种工具,它可用于创建不同类型的图表. 本教程学习什么是JFreeChart?为什么需要它,并在各种方式列出一个基于Java的应用程序或独立创建不同类型的图表. JFre ...

  7. .NET简介

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 微软跨语言运行的主要机制就如上图类似,其最重要的部分是CLR和MSIL:其中MSIL是微软中间语言,它的主要的作用是将不同 的语言,如:C ...

  8. spring配置mybatis的sqlsessionfactory

    <!--读入配置文件 --> <bean id="propertyConfigurer" class="org.springframework.bean ...

  9. CF322F

    CF322F 拉格朗日插值 #include<iostream> #include<cstdio> #include<algorithm> #include< ...

  10. C#中的元组对象Tuple

    原文:C#中的元组对象Tuple 一.什么是元组 元组就是一些对象的集合,在我们编程时,比如一个人的信息,我们常常创建一个Person类去描述一个人,传统的做法如下: public class Per ...