题意

给定两个长度为n的排列p和q,构造一个字符串s满足\(s[p_i]<=s[p_{i+1}]\)和\(s[q_i]<=s[q_{i+1}]\),且满足字符串中不同字符的个数不少于k。

分析

建一个有向图,\(p_i\)到\(p_{i+1}\)连一条有向边,\(q_i\)到\(q_{i+1}\)连一条有向边。

一条链上的点我们可以贪心的让每个点的字符递增,递增到'z'后,让其余字符全部等于'z',而在同一个环中的所有点的字符一定是相同的,可以把所有环都缩成一个点,那么这张图就变成了有向无环图,可以直接拓扑排序做了。

Code

#include<bits/stdc++.h>
#define fi first
#define se second
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define pb push_back
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,k;
int low[maxn],dfn[maxn],st[maxn],inst[maxn],top=-1,cnt,scnt,sc[maxn];
vector<int>g[maxn];
set<int>f[maxn];
int d[maxn],rk[maxn];
int res=-1;
void dfs(int u){
dfn[u]=low[u]=++cnt;
st[++top]=u;
inst[u]=1;
for(int x:g[u]){
if(!dfn[x]){
dfs(x);
low[u]=min(low[u],low[x]);
}else if(inst[x]){
low[u]=min(low[u],dfn[x]);
}
}
if(low[u]==dfn[u]){
scnt++;
while(true){
int x=st[top--];
sc[x]=scnt;
inst[x]=0;
if(x==u) break;
}
}
}
int main(){
ios::sync_with_stdio(false);
//freopen("in","r",stdin);
cin>>n>>k;
int x,y;
cin>>x;
int rt=x;
for(int i=1;i<n;i++){
cin>>y;
g[x].pb(y);
x=y;
}
cin>>x;
for(int i=1;i<n;i++){
cin>>y;
g[x].pb(y);
x=y;
}
for(int i=1;i<=n;i++){
if(!dfn[i]) dfs(i);
}
for(int i=1;i<=n;i++){
for(int x:g[i]){
if(sc[i]!=sc[x]) f[sc[i]].insert(sc[x]);
}
}
for(int i=1;i<=n;i++)
for(int x:f[i])
d[x]++;
queue<int>q;
int mx=-1;
for(int i=1;i<=scnt;i++) rk[i]=-1;
for(int i=1;i<=scnt;i++){
if(d[i]==0) q.push(i),rk[i]=mx=0;
}
while(!q.empty()){
int u=q.front();q.pop();
for(int x:f[u]){
rk[x]=max(rk[u]+1,rk[x]);
rk[x]=min(25,rk[x]);
mx=max(mx,rk[x]);
if(--d[x]==0) q.push(x);
}
}
if(mx+1<k) cout<<"NO\n";
else{
cout<<"YES\n";
for(int i=1;i<=n;i++){
cout<<(char)(rk[sc[i]]+'a');
}cout<<'\n';
}
return 0;
}

codeforces1213F tarjan缩点+拓扑排序的更多相关文章

  1. [模板]tarjan缩点+拓扑排序

    题目:给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次. 题目简述:先t ...

  2. [HAOI2006]受欢迎的牛 tarjan缩点 + 拓扑排序

    ---题面--- 题解: 首先tarjan缩点应该还是容易想到的,因为喜爱具有传递性,所以一个强联通分量里面的点实际上是全部等效的,所以我们可以缩成一个方便判断, 缩完点之后整张图就变成了一个有向无环 ...

  3. 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)

    题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...

  4. [luogu2272 ZJOI2007] 最大半连通子图 (tarjan缩点 拓扑排序 dp)

    传送门 题目描述 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向 ...

  5. 【2019.7.26 NOIP模拟赛 T3】化学反应(reaction)(线段树优化建图+Tarjan缩点+拓扑排序)

    题意转化 考虑我们对于每一对激活关系建一条有向边,则对于每一个点,其答案就是其所能到达的点数. 于是,这个问题就被我们搬到了图上,成了一个图论题. 优化建图 考虑我们每次需要将一个区间向一个区间连边. ...

  6. [ZJOI2007]最大半连通子图 (Tarjan缩点,拓扑排序,DP)

    题目链接 Solution 大概是个裸题. 可以考虑到,如果原图是一个有向无环图,那么其最大半联通子图就是最长的一条路. 于是直接 \(Tarjan\) 缩完点之后跑拓扑序 DP就好了. 同时由于是拓 ...

  7. bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...

  8. HDU 6165 FFF at Valentine(Tarjan缩点+拓扑排序)

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  9. UVA 11324.The Largest Clique tarjan缩点+拓扑dp

    题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...

随机推荐

  1. localStorage存取储数组。(存对象同理)

    var array = ['111','222','333','444','555']; 存window.localStorage.setItem('array',JSON.stringify(arr ...

  2. java 字符串处理的

    @Test public void testString(){ /*字符串处理 */ String email="123456789@qq.com"; System.out.pri ...

  3. Kafka 消息中间件

    kafka简介与应用场景 Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Link ...

  4. (七)Hibernate中使用JDBC

    在hibernate中获取connection数据库连接有两种方法:(操作数据库常用这种方法) 1. session.doReturningWork   返回一个对象,适用于查询方法 2. sessi ...

  5. 通俗化理解Spring3 IoC的原理和主要组件

      ♣什么是IoC? ♣通俗化理解IoC原理 ♣IoC好处 ♣工厂模式 ♣IoC的主要组件 ♣IoC的应用实例 ♣附:实例代码 1.什么是IoC(控制反转)? Spring3框架的核心是实现控制反转( ...

  6. JS OOP -02 深入认识JS中的函数

    深入认识JS中的函数: 1.概述,认识函数对象 2.函数对象和其他内部对象的关系 3.将函数作为参数传递 4.传递给函数的隐含参数:arguments 5.函数的apply,call方法和length ...

  7. Error:Unable to start the daemon process. This problem might be caused by incorrect configuration of

    我试了修改或者配置gradle文件没有成功解决的 ,所以试了这个解决方案 试了下这个是可以解决的. 变量名   _JAVA_OPTIONS 变量值   -Djava.net.preferIPv4Sta ...

  8. ffmpeg转MP4文件为m3u8格式

    第一种转换命令 #转mp4为ts ffmpeg -y -i D:\videos\BgFCWkn00qPBmWVzIEf0eQjaekx0oRjlk9VY2PcR.mp4 -vcodec copy -a ...

  9. 数据库 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1.mdf' 已存在。请选择其他数据库

    关于asp.net编译中出现 数据库 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\test1.md ...

  10. jeffy-vim-v2.9

    http://pan.baidu.com/s/1qW1DlP6