/*
有向边(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. web,xmlSecurity

    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://w ...

  2. 洛谷 P2441 角色属性树

    题目描述 绪萌同人社是一个有趣的组织,该组织结构是一个树形结构.有一个社长,直接下属一些副社长.每个副社长又直接下属一些部长……. 每个成员都有一个萌点的属性,萌点属性是由一些质数的萌元素乘积构成(例 ...

  3. Nginx加载多个CPU核心,worker_cpu_affinity

    配置Nginx多核CPU,worker_cpu_affinity使用方法和范例1. 2核CPU,开启2个进程 worker_processes 2;worker_cpu_affinity 01 10; ...

  4. Django中的HttpRequsest 和Httpresponse对象

    HttpRequest对象:每一个用户请求在到达视图函数的同时,django会自动创建一个HttpRequest对象并把这个对象当做第一个参数传给要调用的views方法,HttpRequest对象里封 ...

  5. leetcode上的一些动态规划

    70-爬楼梯 思路:该问题可以理解为经典的“斐波那契数列”问题,但这里需要用动规实现,递归会超时 class Solution { public: int climbStairs(int n) { v ...

  6. Windows-添加环境变量(path)

    使用命令提示符(cmd.批处理.Batch..bat)添加环境变量 永久环境变量 命令提示符下修改 注意:要使用管理员身份运行 cmd set PATH=%PATH%;要添加的路径 reg add & ...

  7. Openstack组建部署 — Environment of Controller Node

    目录 目录 前文列表 Controller Node Install and configure components Setup DNS Server Setup NTP Server Instal ...

  8. python#父与子编程之旅-11嵌套与可变循环

    for multiplier in range(5,8): for i in range(2,11): print(i,"x",multiplier,"=",i ...

  9. Java原理领悟-JMM(java内存模型认知)

    总线锁.缓存锁.MESI缓存一致性协议.CPU 层面的内存屏障 1.JMM定义: Java Memory Model(java内存模型)是一系列的Java虚拟机平台对开发者提供的多线程环境下的内存可见 ...

  10. accordion(分类)组件

    一.依赖于 Panel(面板)组件 二.class加载方式 <div id="box" class="easyui-accordion" style=&q ...