排序+并查集——cf1213F
/*
有向边(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的更多相关文章
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的. 相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0 ...
- 拓扑排序 - 并查集 - Rank of Tetris
Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球 ...
- LA 4255 (拓扑排序 并查集) Guess
设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...
- Rank of Tetris(hdu1811拓扑排序+并查集)
题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...
- 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 ...
- HDU 1811 Rank of Tetris 拓补排序+并查集
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) [ ...
- Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)
Problem Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...
- LA4255/UVa1423 Guess 拓扑排序 并查集
评分稍微有一点过分..不过这个题目确确实实很厉害,对思维训练也非常有帮助. 按照套路,我们把矩阵中的子段和化为前缀和相减的形式.题目就变成了给定一些前缀和之间的大小关系,让你构造一组可行的数据.这个东 ...
随机推荐
- while循环语句基础
while循环语句基础 一while循环语句介绍 循环语句命令常用于重复执行一条指令或一组指令,直到条件不再满足时停止, Shell脚本语言的循环语句常见的有while, until, for及s ...
- 获取FileSystem
/** * 根据配置文件获取HDFS操作对象 * 有两种方法: * 1.使用conf直接从本地获取配置文件创建HDFS对象 * 2.多用于本地没有hadoop系统,但是可以远程访问.使用给定的URI和 ...
- vue基础九
1.使用组件 1.1注册 要注册一个全局组件,你可以使用 Vue.component(tagName, options). 例如: Vue.component('my-component', { // ...
- Android中的ImageView的getDrawableCache获取背景图片的时候注意的问题
获取ImageView的背景图片使用getDrawableCache方法,不要使用getDrawable方法,后者获取不到图片的. 1.在调用imageView.getDrawableCache()之 ...
- ThinkPHP示例:图片上传
ThinkPHP示例之图片上传,包括图片上传.数据库保存.缩略图生成以及图片水印功能演示.首先需要下载框架核心,然后把示例解压到Web根目录下面,并修改入口文件中的框架入口文件的位置.导入示例目录下面 ...
- iOS之CAReplicatorLayer属性简介和使用
1.CAReplicatorLayer简介 CAReplicatorLayer用于对图层进行复制,包括图层的动画也能复制!可以看着将某一段事务进行重复! #import <QuartzCore/ ...
- 微信支付(JsApi)
这两天有个小项目用的微信网页jsapi支付 用的thinkphp框架开发 ,首次做微信支付 碰了很多壁,做了简单就记录,方便回顾 也希望对大家能有点帮助,也希望路过的大神批评指正.. 一.必备条件及相 ...
- UVA1632_Alibaba
题目链接 大致题意:直线上面有n个点,第i个点坐标为xi,它会在di时间消失,你可以选择从任何位置出发,求访问完所有点的最短时间,无解输出no solution 思路:这有一个难点就是,不知道状态该怎 ...
- Dubbo与SpringBoot的结合
前言 这段时间在接触分布式的内容,因为公司的技术栈是 dubbo ,所以我顺其自然地选择了 dubbo 作为我学习的框架. 看了任务清单,这篇文章应该是在6天前出来的,但是因为实习等等的一些事情耽误了 ...
- docker报错: x509: certificate has expired or is not yet valid
环境:最小化安装centos7 问题:docker 启动没问题,但是查询 镜像时报错 Error response from daemon: Get https://index.docker.io/v ...