Codeforces 1213F Unstable String Sort
中文题意
求一个由最多26个、最少k个小写字母构成的,长度为n的字符串,这个字符串要满足的要求是——当其中字母按照p和q两个\(1\)~\(n\)的全排列重新排序时,新的字符串是按照升序排好序的(没要求老字符串排好序)。
解题思路
虚拟赛时其实已经走到了想出正解的路上我在路上了。正解是这样——对于排列p,将所有p[i]到p[i+1]连边,对于q也将所有q[i]和q[i+1]连边,那么每条边就代表前面位置的字母要小于等于后面位置的字母,那对于这个图中的的所有强连通分量,上边的字母应该都是相同的。于是缩点产生一个DAG,这个DAG前面的字母小于等于后面的字母,于是BFS一遍删点,删点的时候给该点赋一个字母,然后字母加一。最后输出答案就好。
虚拟赛时想到的是把p和q扫一遍,然后对于p和q中的一个位置上的不同数字,那么这两个数字代表的新位置之间的字母应该相同,但是这两个位置之间的其他数字也产生了其他一对对位置,然后复杂度就上去了……乱七八糟的各种没想清楚。
源代码
#include<queue>
#include<cstdio>
#include<algorithm>
const int MAXN=2e5+5;
int n,k;
struct Edge{
int nxt,to;
}e[MAXN<<2],e2[MAXN<<2];
int head[MAXN],cnt=1,head2[MAXN],cnt2=1;
inline void add(int u,int v)
{
e[cnt]={head[u],v};
head[u]=cnt++;
}
inline void add2(int u,int v)
{
e2[cnt2]={head2[u],v};
head2[u]=cnt2++;
}
int num=0,id[MAXN];//强连通分量数量
int ru[MAXN];//强连通分量的入度
int ind=1,dfn[MAXN],low[MAXN];
int stack[MAXN],top=0;
bool instack[MAXN];
void dfs(int u)
{
dfn[u]=low[u]=ind++;
stack[top++]=u;
instack[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(!dfn[v])
{
dfs(v);
low[u]=std::min(low[u],low[v]);
}
else if(instack[v]) low[u]=std::min(low[v],low[u]);
}
if(dfn[u]==low[u])
{
int v;
num++;
do{
v=stack[--top];
instack[v]=0;
id[v]=num;
}while(u!=v);
}
}
char ans[MAXN];
void bfs()
{
std::queue<int> q;
for(int u=1;u<=num;u++) if(!ru[u]) q.push(u);
char x='a';
while(!q.empty())
{
int u=q.front();
ans[u]=x;
if(x!='z') x++;
q.pop();
for(int i=head2[u];i;i=e2[i].nxt)
{
int v=e2[i].to;
ru[v]--;
if(!ru[v]) q.push(v);
}
}
}
int main()
{
// freopen("test.in","r",stdin);
scanf("%d%d",&n,&k);
for(int x=0;x<2;x++)
{
int temp;
scanf("%d",&temp);
for(int i=1,j;i<n;i++)
{
scanf("%d",&j);
add(temp,j);
temp=j;
}
scanf("%d",&temp);
for(int i=1,j;i<n;i++)
{
scanf("%d",&j);
add(temp,j);
temp=j;
}
}
for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);//6>5>4>3>2>1
if(num<k)
{
puts("NO");
return 0;
}
for(int u=1;u<=n;u++)
{
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(id[u]!=id[v]) add2(id[u],id[v]),ru[id[v]]++;
}
}
puts("YES");
bfs();
for(int i=1;i<=n;i++)
{
putchar(ans[id[i]]);
}
return 0;
}
Codeforces 1213F Unstable String Sort的更多相关文章
- Codeforces Round #582 (Div. 3) F. Unstable String Sort
传送门 题意: 你需要输出一个长度为n的字符序列(由小写字母组成),且这个字符串中至少包含k个不同的字符.另外题目还有要求:给你两个长度为p和q的序列,设字符序列存在s中 那么就会有s[Pi]< ...
- CF1213F Unstable String Sort(差分)
其实全部可以为同一种字符串,但题目要求\(k\)种,我们考虑开始尽可能不同,最后再取\(min\) 考虑\(A\),全部不同:再做\(B\),\(S[b_{i-1}]\le S[b_{i}]\)如果开 ...
- CF1213F Unstable String Sort
题目链接 问题分析 题目实际上是一堆大于等于的约束.观察这\(2n-2\)个约束.第一组可以将要求的排成一个不降的序列,然后第二组就是在第一组的基础上再添加条件. 不妨设第一组生成的不降序列是\(\{ ...
- codeforces1213F Unstable String Sort 思维
题目传送门 题意:a和b都代表字符串的下标,至少用k个字符,构造一个长度为n的字符串,将这个字符串中的字符按无论是按$a$写还是按$b$写,字典序都非递减. 思路:如果将$a[l,r]=b[l,r]$ ...
- 830. String Sort
830. String Sort 题解 int alpha[256] = {0};//记录字符的次数 bool cmp(char a,char b) { if(alpha[a]==alpha[b])/ ...
- Codeforces 1197 E (dp+sort+二分) (Rust)
原题链接 2300分 大意 俄罗斯套娃,每个有内容半径in和外围半径out in_i<out_i 如果 in_i >= out_j ,那么j可以放在i内 定义残留空间 = 一列嵌套的套娃 ...
- CodeForces 797C Minimal string:贪心+模拟
题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...
- Codeforces 827E Rusty String - 快速傅里叶变换 - 暴力
Grigory loves strings. Recently he found a metal strip on a loft. The strip had length n and consist ...
- Codeforces 797C - Minimal string
C. Minimal string 题目链接:http://codeforces.com/problemset/problem/797/C time limit per test 1 second m ...
随机推荐
- OpenTSDB在HBase中的底层数据结构设计
0.时序数据库 时间序列(Time Series):是一组按照时间发生先后顺序进行排列的数据点序列,通常一组时间序列的时间间隔为一恒定值(如1秒,5分钟,1小时等). 时间序列数据可被简称为时序数据. ...
- 自动生成ID
public class IdUtil { /** * * @return 返回时间id,类似于20191217195622 */ public static String timeId(){ Dat ...
- Feign声明式服务调用
Feign是一种声明式.模板化的HTTP客户端(仅在Application Client中使用).声明式调用是指,就像调用本地方法一样调用远程方法,无需感知操作远程http请求. Spring Clo ...
- CentOS 7 防火墙常用操作及常见问题处理
一.常用操作 1.启动防火墙: systemctl start firewalld.service 2.关闭防火墙: systemctl stop firewalld.service 3.添加放行端口 ...
- 使用parquet-hadoop.jar包解析hive parquet文件时,遇到FIXED_LEN_BYTE_ARRAY转换为Decimal 以及 INT96转换为timestamp问题
在使用parquet-hadoop.jar包解析parquet文件时,遇到decimal类型的数据为乱码,具体解决方法如下: 使用parquet-Hadoop.jar解析httpfs服务提供的parq ...
- tomcat进行压测时,cpu占用90%
1.top 命令查看占用cpu高的进程,pid=15019 2.查看该进程下所有占用cppu高的线程 top -Hp pid 即:top -Hp 15019 得到pid 3.获取15030的16进 ...
- O013、动手实践Linux VLAN
参考https://www.cnblogs.com/CloudMan6/p/5326737.html 本节我们来看如何在实验环境中实施和部署如下的VLAN 网络
- TCP/IP模型层次结构
计算机网络体系结构 (1)OSI七层协议:从上到下:应用层.表示层.会话层.传输层.网络层.数据链路层.物理层. (2)TCP/IP四层协议:从上到下:应用层,传输层.网络层.数据链路层.网络接口层. ...
- mysql 5.7.24 root密码重置
sudo mysql -u root -p 初始root密码没有,直接按回车 show databases: use mysql; update user set authentication_str ...
- 关于cli打包至服务器出现的BUG(样式错乱,路径出错)解决方案
很久没来博客园了,今天给大家带来两个硬货bug,前端大牛可能不觉得是啥,但是对于没碰到过这问题的小菜鸟我来说还是很不错的 1.npm run build 至服务端的时候出现路径报错解决方案 ①.本地测 ...