传送门

•题意

给你两个数组 p,q ,分别存放 1~n 的某个全排列;

让你根据这两个数组构造一个字符串 S,要求:

(1)$\forall i \in [1,n-1],S_{pi}\leq S _{pi+1}  ,\forall i \in [1,n-1],S_{qi} \leq S _{qi+1}$

(2)字符串 S 至少包含 k 个不同的小写字母;

•思路

类似于牛客第五场的H

不过由于这个不知道字母是什么,需要利用强联通分解,

把属于同一个强联通块的位置置于同一个字母,

然后根据前后关系建图连边

•代码

 #include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof a)
const int maxn=2e5+;
int n,m;
int a[maxn];
struct Edge
{
int to,next;
}G[maxn*];
int head[maxn],cnt;
void addEdge(int u,int v)
{
G[++cnt].to=v;
G[cnt].next=head[u];
head[u]=cnt;
} int col[maxn];
struct SCC///强联通分量分解
{
bool vis[maxn];
vector<int> vs; void DFS(int u)
{
vis[u]=true;
for(int i=head[u];i;i=G[i].next)
{
int v=G[i].to;
if(!(i&)||vis[v])
continue;
DFS(v);
}
vs.push_back(u);
} void REDFS(int u,int k)
{
vis[u]=true;
col[u]=k;
for(int i=head[u];i;i=G[i].next)
{
int v=G[i].to;
if((i&)||vis[v])
continue;
REDFS(v,k);
}
} int scc()
{
vs.clear();
mem(vis,false);
for(int i=;i<=n;i++)
if(!vis[i])
DFS(i); mem(vis,false);
int k=;
for(int i=vs.size()-;i>=;i--)
if(!vis[vs[i]])
REDFS(vs[i],++k); return k;
}
}_scc; Edge newG[maxn*];
int head2[maxn];
void addnew(int u,int v)
{
newG[++cnt].to=v;
newG[cnt].next=head2[u];
head2[u]=cnt;
}
int Indu[maxn];
char ch[maxn];
queue<int >q;
void topsort(int k)///拓扑排序
{
while(!q.empty())
q.pop();
for(int i=;i<=k;i++)
if(!Indu[i])
q.push(i); int now=;
while(!q.empty())
{
int u=q.front();
ch[u]='a'+now;
///>=m个不同字母,那就正好m个,后面的都置为同一个
if(now<m-)
now++;
q.pop();
for(int i=head2[u];i;i=newG[i].next)
{
int v=newG[i].to;
Indu[v]--;
if(!Indu[v])
q.push(v);
}
}
}
int main()
{
cin>>n>>m;
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)
cin>>a[j];
for(int j=;j<=n-;j++)
{
addEdge(a[j],a[j+]);
addEdge(a[j+],a[j]);
}
}
int k=_scc.scc();
if(k<m)
puts("NO");
else
{
puts("YES");
cnt=; ///缩点,把每一个联通快看做一个点
///利用点col[i]之间的关系建图,跑拓扑序
for(int u=;u<=n;u++)
{
for(int i=head[u];i;i=G[i].next)
{
int v=G[i].to;
if(!(i&)||col[u]==col[v])
continue;
addnew(col[u],col[v]);
Indu[col[v]]++;
}
}
topsort(k); for(int i=;i<=n;i++)
cout<<ch[col[i]];
}
}

CodeForces 1213F (强联通分量分解+拓扑排序)的更多相关文章

  1. POJ 2762Going from u to v or from v to u?(强联通 + 缩点 + 拓扑排序)

    [题意]: 有N个房间,M条有向边,问能否毫无顾虑的随机选两个点x, y,使从①x到达y,或者,②从y到达x,一定至少有一条成立.注意是或者,不是且. [思路]: 先考虑,x->y或者y-> ...

  2. HDU 6170 FFF at Valentine(强联通缩点+拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6165 题意:给你一个无环,无重边的有向图,问你任意两点,是否存在路径使得其中一点能到达另一点 解析:强 ...

  3. 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】

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

  4. 【POJ 1236 Network of Schools】强联通分量问题 Tarjan算法,缩点

    题目链接:http://poj.org/problem?id=1236 题意:给定一个表示n所学校网络连通关系的有向图.现要通过网络分发软件,规则是:若顶点u,v存在通路,发给u,则v可以通过网络从u ...

  5. POJ 2186 Popular Cows(强联通分量)

    题目链接:http://poj.org/problem?id=2186 题目大意:    每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种 ...

  6. POJ 2186 Popular cows(Kosaraju+强联通分量模板)

    题目链接:http://poj.org/problem?id=2186 题目大意:给定N头牛和M个有序对(A,B),(A,B)表示A牛认为B牛是红人,该关系具有传递性,如果牛A认为牛B是红人,牛B认为 ...

  7. POJ 2186-Popular Cows (图论-强联通分量Korasaju算法)

    题目链接:http://poj.org/problem?id=2186 题目大意:有n头牛和m对关系, 每一对关系有两个数(a, b)代表a牛认为b牛是“受欢迎”的,且这种关系具有传递性, 如果a牛认 ...

  8. 强联通分量之kosaraju算法

    首先定义:强联通分量是有向图G=(V, E)的最大结点集合,满足该集合中的任意一对结点v和u,路径vu和uv同时存在. kosaraju算法用来寻找强联通分量.对于图G,它首先随便找个结点dfs,求出 ...

  9. 【Luogu P3387】缩点模板(强连通分量Tarjan&拓扑排序)

    Luogu P3387 强连通分量的定义如下: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶 ...

随机推荐

  1. 比较全面的一个PHP缓存类解析

    转自:http://www.blhere.com/1164.html 一.引论 PHP,一门最近几年兴起的web设计脚本语言,由于它的强大和可伸缩性,近几年来得到长足的发展,php相比传统的asp网站 ...

  2. 项目上使用的每月1日自动导出Zabbix性能数据的python脚本

    基于zabbix-manager python2.7 #!/usr/bin/env python # -*- coding: utf-8 -*- # __author__ = "life&q ...

  3. python 文本文件的读取

  4. AT2346 No Need

    atcoder上的题目 链接 一道思维题目 可以发现如果X是可有可无的,那么所有小于X的数也一定是可有可无的, 所有我们只要找出最大的那个可有可无的数字就好了 进一步分析,发现 若A1, A2, . ...

  5. 【Linux】根目录命名的意义

    1./bin :获得最小的系统可操作性所需要的命令2./boot :内核和加载内核所需的文件3./dev :终端.磁盘.调制解调器等的设备项4./etc :关键的启动文件和配置文件5./home :用 ...

  6. 巨蟒python全栈开发-第11阶段 ansible_project3

    今日大纲: 1.用户创建 2.前端优化 3.用户编辑 4.用户删除 5.ansible api介绍 1.用户创建 新建一个user_create.html的页面 <form class=&quo ...

  7. 2018-8-10-win10-uwp-使用动画修改-Grid-column-的宽度

    title author date CreateTime categories win10 uwp 使用动画修改 Grid column 的宽度 lindexi 2018-08-10 19:17:19 ...

  8. HZOJ Tree

    看到换根果断lct啊,然而其实我板子还没有打熟,还不会维护子树信息,于是就挂掉了…… 然而正解并不是lct. 其实好像很久很久以前将lca的时候好像讲到过一道换根的题,当时没有听懂. 直接说正解吧: ...

  9. 威胁快报|挖矿团伙8220进化,rootkit挖矿趋势兴起

    近日,阿里云安全团队发现8220挖矿团伙为了更持久的驻留主机以获得最大收益,开始使用rootkit技术来进行自我隐藏.这类隐藏技术的使用在watchdogs等挖矿蠕虫使用后开始出现逐渐扩散和进化的趋势 ...

  10. @codeforces - 1187F@ Expected Square Beauty

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个序列 x = {x1, x2, ..., xn},已知 ...