/*
有向边(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. django 邮箱发送

    在django中提供了邮件接口 QQ邮箱配置 qq邮箱地扯:https://mail.qq.com settings文件 # 邮箱配置 EMAIL_USE_SSL = True EMAIL_HOST ...

  2. spring整合hibernate之买书小测试

    spring来整合hibernate就是用spring来管理hibernate的sessionFactory和让hibernate来使用spring的声明式事务. 一:加入相应的jar包. 二:写hi ...

  3. Struts拦截器Interceptor

    Struts2 拦截器 [Interceptor] 拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部.拦截器可以在Action执行直线做相似的操作也可以在Action执行直后 ...

  4. php ceil()函数 语法

    php ceil()函数 语法 ceil()函数怎么用? php ceil()函数的作用是向上舍入为最接近的整数,语法是ceil(number),表示返回不小于参数X的下一个整数,如果没有小数,返回参 ...

  5. C# GDI+简单绘图

    一.使用Pen画笔 Pen的主要属性有: Color(颜色),DashCap(短划线终点形状),DashStyle(虚线样式),EndCap(线尾形状), StartCap(线头形状),Width(粗 ...

  6. MDK(keil)4.7中文注释乱码解决

    由于编码使用不统一导致别的开发环境下的文件在MDK(keil)下打开中文显示乱码,解决这一问题需要进行码制转换, 可以先将欲打开的文件转换成UTF-8格式(如在notepad中进行转换),也可以在打开 ...

  7. Least Common Ancestors

    /* Least Common Ancestors * Au: Small_Ash */ #include <bits/stdc++.h> using namespace std; con ...

  8. [CSP-S模拟测试]:金(king)(高精度+模拟)

    题目传送门(内部题36) 输入格式 第一行一个整数$T$,表示数据组数. 接下来$T$行,每行两个空格隔开的整数$n,m$. 输出格式 对于每组数据,输出一行$"Yes"$或$&q ...

  9. django更换默认数据库sqlite3为pymsql后出现Keyerror:255的解决办法----升级PyMySQL

    一.更换数据库的办法: 1.安装PyMySQL 2.修改project目录同名文件下的settings.py:DATABASES = { 'default': { # 'ENGINE': 'djang ...

  10. Mysql 主从同步(转载)

    第一步: 在master上创建用于同步的用户 GRANT FILE,REPLICATION SLAVE,REPLICATION CLIENT,SUPER ON *.* TObackup@'192.16 ...