传送门

•题意

给你两个数组 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

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

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

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

•代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define mem(a,b) memset(a,b,sizeof a)
  4. const int maxn=2e5+;
  5. int n,m;
  6. int a[maxn];
  7. struct Edge
  8. {
  9. int to,next;
  10. }G[maxn*];
  11. int head[maxn],cnt;
  12. void addEdge(int u,int v)
  13. {
  14. G[++cnt].to=v;
  15. G[cnt].next=head[u];
  16. head[u]=cnt;
  17. }
  18.  
  19. int col[maxn];
  20. struct SCC///强联通分量分解
  21. {
  22. bool vis[maxn];
  23. vector<int> vs;
  24.  
  25. void DFS(int u)
  26. {
  27. vis[u]=true;
  28. for(int i=head[u];i;i=G[i].next)
  29. {
  30. int v=G[i].to;
  31. if(!(i&)||vis[v])
  32. continue;
  33. DFS(v);
  34. }
  35. vs.push_back(u);
  36. }
  37.  
  38. void REDFS(int u,int k)
  39. {
  40. vis[u]=true;
  41. col[u]=k;
  42. for(int i=head[u];i;i=G[i].next)
  43. {
  44. int v=G[i].to;
  45. if((i&)||vis[v])
  46. continue;
  47. REDFS(v,k);
  48. }
  49. }
  50.  
  51. int scc()
  52. {
  53. vs.clear();
  54. mem(vis,false);
  55. for(int i=;i<=n;i++)
  56. if(!vis[i])
  57. DFS(i);
  58.  
  59. mem(vis,false);
  60. int k=;
  61. for(int i=vs.size()-;i>=;i--)
  62. if(!vis[vs[i]])
  63. REDFS(vs[i],++k);
  64.  
  65. return k;
  66. }
  67. }_scc;
  68.  
  69. Edge newG[maxn*];
  70. int head2[maxn];
  71. void addnew(int u,int v)
  72. {
  73. newG[++cnt].to=v;
  74. newG[cnt].next=head2[u];
  75. head2[u]=cnt;
  76. }
  77. int Indu[maxn];
  78. char ch[maxn];
  79. queue<int >q;
  80. void topsort(int k)///拓扑排序
  81. {
  82. while(!q.empty())
  83. q.pop();
  84. for(int i=;i<=k;i++)
  85. if(!Indu[i])
  86. q.push(i);
  87.  
  88. int now=;
  89. while(!q.empty())
  90. {
  91. int u=q.front();
  92. ch[u]='a'+now;
  93. ///>=m个不同字母,那就正好m个,后面的都置为同一个
  94. if(now<m-)
  95. now++;
  96. q.pop();
  97. for(int i=head2[u];i;i=newG[i].next)
  98. {
  99. int v=newG[i].to;
  100. Indu[v]--;
  101. if(!Indu[v])
  102. q.push(v);
  103. }
  104. }
  105. }
  106. int main()
  107. {
  108. cin>>n>>m;
  109. for(int i=;i<=;i++)
  110. {
  111. for(int j=;j<=n;j++)
  112. cin>>a[j];
  113. for(int j=;j<=n-;j++)
  114. {
  115. addEdge(a[j],a[j+]);
  116. addEdge(a[j+],a[j]);
  117. }
  118. }
  119. int k=_scc.scc();
  120. if(k<m)
  121. puts("NO");
  122. else
  123. {
  124. puts("YES");
  125. cnt=;
  126.  
  127. ///缩点,把每一个联通快看做一个点
  128. ///利用点col[i]之间的关系建图,跑拓扑序
  129. for(int u=;u<=n;u++)
  130. {
  131. for(int i=head[u];i;i=G[i].next)
  132. {
  133. int v=G[i].to;
  134. if(!(i&)||col[u]==col[v])
  135. continue;
  136. addnew(col[u],col[v]);
  137. Indu[col[v]]++;
  138. }
  139. }
  140. topsort(k);
  141.  
  142. for(int i=;i<=n;i++)
  143. cout<<ch[col[i]];
  144. }
  145. }

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. 阿里云OSS同城冗余存储正式商业化,提供云上同城容灾能力

    近日,阿里云正式发布OSS同城冗余存储产品.这是国内目前提供同城多AZ冗余部署能力覆盖最广的云上对象存储产品,可以实现云存储的同城双活,满足企业级客户对于“发生机房级灾难事件时数据不丢失,业务不中断” ...

  2. bzoj4152 The Captain

    Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2 ...

  3. 在dva框架和create-react-app创建出来的框架中修饰器语法与按需加载引入antd分别配置

    按需加载需要的包  babel-plugin-import    装饰器语法需要的包  @babel/plugin-proposal-decorators dva框架 将.webpackrc  改成. ...

  4. kubernetes1.3:操作Docker

    Kubernetes对Docker的管理是通过一个第三方组件实现的.在Kubernetes1.2中这个第三方组件就是go-dockerclient,这是一个GO语言写的docker客户端,支持Dock ...

  5. 在沙箱中IE不能上网的解决方法

    近期在解决一个问题,在我们的沙箱中IE不能上网 现象:     IE不能上网.输入www.baidu.com 提示:不能查找到DNS.也不能ping 通     其它浏览器上网没有问题(SG浏览器,C ...

  6. 2018-7-5-dotnet-设计规范-·-抽象定义

    title author date CreateTime categories dotnet 设计规范 · 抽象定义 lindexi 2018-07-05 15:48:20 +0800 2018-2- ...

  7. C++中用stringstream类进行数据类型的转换

    我们在进行C++编程过程中,经常需要进行数据类型的转换. stringstream 类的作用就是进行数据类型转换.要想在程序中使用 stringstream 类,我们需要在源程序文件中包含头文件inc ...

  8. @topcoder - 2017TCOAlgorithmRound2A - D1L2@ DistanceZeroAndOne

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个 n 个点的无向简单的连通图,编号从 0 到 n-1. 现给 ...

  9. 设计模式 - 工厂模式(factory pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/27081511 工厂模式(factory pa ...

  10. @游记@ CQOI2019(十二省联考)

    目录 @day - 0@ @day - 1@ @day - 2@ @后记@ 我只是来打酱油哒-- 顶多能进个 E 类继续打酱油. 原本还在互奶 A 队,结果现在--铁定进不了队啦. 对初中生的歧视啊 ...