题目描述

在虚拟国度里多了很多 Virtual oier,为了树立对后辈的威信,从第 11 个 Virtual oier 开始的 oier 们搞起了年功序列的制度。
虚拟国度的创始人 oier Chtholly 感觉非常有趣,于是他决定观测 11 到 nn 这些人,他观测到了一些有趣的现象:虚拟国度里有一些凳子,如果 aa 是 的先辈则 能在 前面得到凳子
Chtholly的观测可以构成 mm 个序列,每个序列有 kk 个元素 a1,a2,a3,⋅⋅⋅⋅⋅⋅,aka1a 2a3,⋅⋅⋅⋅⋅⋅,a k。表示在 aia 有凳子前 a1,a2,a3,⋅⋅⋅⋅⋅⋅,ai−1a 1a2 ,a 3⋅⋅⋅⋅⋅⋅,a i−1必须有凳子。(ai−1a i−1是 aia的前辈)
例如 k = 3 时:a=1,2,3a=1,2,3,表示 33 有凳子前 1,21,2必须都有凳子,22 有凳子前 11 必须有凳子。
但 Chtholly 年纪大了记忆力未必好,如果第 ii 个序列与前 i−1i−1 个序列冲突的话那么就只需要考虑前 i−1i−1 个序列就好了。(忽略第 ii 个序列)
Chtholly 希望知道 11 到 nn 个人的年功序列的最小字典序。

输入格式
第一行两个数 n,mn,m
接下来 m 行每行第一个数为 kk,接下来 kk 个数为这次观测构成的序列

输出格式
输出 nn 个数构成的最小字典序。

样例
样例输入
4 3
3 1 2 3
2 4 2
3 3 4 1

样例输出
1 4 2 3

样例解释
第三个观测序列与前两个观测序列冲突不考虑,前两个观测序列可以构成 11 44 22 33 或者 44 11 22 33 这两个序列,字典序小的为 11 44 22 33。

数据范围与提示
3030%的数据,n≤10,m≤4n≤10,m≤4
5050%的数据,n≤10000,m≤5000n≤10000,m≤5000
100100%的数据,n≤100000,m≤50000,k≤nn≤100000,m≤50000,k≤n

题目分析

首先,如果不考虑有冲突的情况下,那这就是一道模板题了,也就是用优先队列的拓扑排序,于是,问题便变成如何处理冲突

首先有一个思路,就是用dfs,一个一个地添加序列,如果,拓扑排序满足的话,就可以直接输出了,但是,这个思路首先肯定会T,其次,可能不会满足字典序最小,于是,就又要想其他思路了
好好读题,会发现

如果第 i个序列与前 i+1个序列冲突的话那么就只需要考虑前  i个序列就好了。

思考一下,会发现,每一个序列满足必须是前一个序列满足,所以,如果有一个序列不满足,剩余的就不用输入了下一个问题,便成了如何判断可行

这时,回归拓扑排序的定义, 无环 ,也就是判断是否有环

    for (int i = 0; i < g[x].size(); i++)  //邻接表
{
if (vis[g[x][i]]) //已经走过
{
return 0;
}
vis[g[x][i]] = 1; //标记
if (!check(g[x][i])) //如果下一个顶点有环,说明,这张图都有环
{
return 0;
}
vis[g[x][i]] = 0;//回溯
}
return 1;
}

因为判断要用邻接表,所以,如果判断有环,我们要删去邻接表,顺便,就删去
入度的tot

for(int j=1;j<k;j++)
{ g[a[j]].pop_back();
tot[a[j+1]]--;
}

代码


#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
int x, y;
int m;
int n;
int tot[100005];
vector<int> g[100005];
vector<int> ans;
int vis[100005];
int k;
int cnt = 0;
int a[100005];
priority_queue<int, vector<int>, greater<int> > q;
bool check(int x) {
for (int i = 0; i < g[x].size(); i++) //邻接表
{
if (vis[g[x][i]]) //已经走过
{
return 0;
}
vis[g[x][i]] = 1; //标记
if (!check(g[x][i])) //如果下一个顶点有环,说明,这张图都有环
{
return 0;
}
vis[g[x][i]] = 0;//回溯
}
return 1;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf("%d", &k);
for (int j = 1; j <= k; j++) {
scanf("%d", &a[j]);
if (j == 1) {
continue;
} // 1没有入度
g[a[j - 1]].push_back(a[j]);
tot[a[j]]++;
}
memset(vis, 0, sizeof(vis));
if (!check(a[1])) {
for (int j = 1; j < k; j++) {
g[a[j]].pop_back();
tot[a[j + 1]]--;
}
break;
}
} for (int i = 1; i <= n; i++) {
if (!tot[i]) {
q.push(i);
}
}
while (!q.empty()) {
int k = q.top();
q.pop();
ans.push_back(k);
for (int i = 0; i < g[k].size(); i++) {
tot[g[k][i]]--;
if (!tot[g[k][i]]) {
q.push(g[k][i]);
}
}
}
for (int i = 0; i < ans.size(); i++) {
printf("%d ", ans[i]);
}
}

年功序列c++游戏的更多相关文章

  1. bzoj3255 一个关于序列的游戏

    题意是啥 给你一个数列,可以任意删去一段,记其长度为$s$,得到$val_s$的价值,问你最大价值和为多少.. 其中这一段数要满足成一个上凸且相邻数差为$1$ 显然,删掉一段数后剩下的左右会相邻.. ...

  2. 【BZOJ-3675】序列分割 DP + 斜率优化

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1420  Solved: 583[Submit][Statu ...

  3. 第1部分: 游戏引擎介绍, 渲染和构造3D世界

    原文作者:Jake Simpson译者: 向海Email:GameWorldChina@myway.com ---------------------------------------------- ...

  4. 【斜率DP】BZOJ 3675:[Apio2014]序列分割

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 427[Submit][Statu ...

  5. 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割

    Description 小H最近迷上了一个分割序列的游戏.在这个游戏里,小H需要将一个长度为N的非负整数序列分割成k+l个非空的子序列.为了得到k+l个子序列, 小H将重复进行七次以下的步骤: 1.小 ...

  6. BZOJ 3675: [Apio2014]序列分割( dp + 斜率优化 )

    WA了一版... 切点确定的话, 顺序是不会影响结果的..所以可以dp dp(i, k) = max(dp(j, k-1) + (sumn - sumi) * (sumi - sumj)) 然后斜率优 ...

  7. [BZOJ3675]序列分割

    3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MB Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H ...

  8. bzoj 3675: [Apio2014]序列分割

    Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首 ...

  9. 【BZOJ3675】序列分割(斜率优化,动态规划)

    [BZOJ3675]序列分割(斜率优化,动态规划) 题面 Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得 ...

随机推荐

  1. Dubbo使用Zookeeper注册中心

    在生产环境下使用最多的注册中心为Zookeeper,当然,Redis也可以做注册中心 一.创建提供者02-provider-zk (1) 导入依赖 https://blog.csdn.net/u012 ...

  2. 【Linux】【Services】【SaaS】Docker+kubernetes(1. 基础概念与架构图)

    1.简介 1.1.  背景:公司正在进行敏捷开发环境的搭建,以取代传统的架构,好处大大的,我就不赘述了.公司原来负责这个项目的同事要转组,我只好交给另外同事继续,但是为了防止同样的事情,我也需要深入了 ...

  3. SSM和springboot对比

    今天在开源中国上看到一篇讲SSM.SpringBoot讲的不错的回答,分享! https://www.oschina.net/question/930697_2273593 一.SSM优缺点应该分开来 ...

  4. gitlab的分支保护配置

    目录 一.简介 二.Gitlab配置步骤 一.简介 开发当前开发的分支遇到暂时无法解决的问题,现在有需要开发其他应用,所以希望运维这边将当前有问题分支冻结,让其他人无法进行修改,待后续有时间在排查代码 ...

  5. Excel如何使用vlookup

    一.vlookup的语法 VLOOKUP (lookup_value, table_array, col_index_num, [range_lookup]) ①Lookup_value为需要在数据表 ...

  6. 【C++】使用VS2022开发可以在线远程编译部署的C++程序

    前言: 今天没有前言. 一.先来一点C++的资源分享,意思一下. 1.c++类库源码以及其他有关资源.站点是英文的,英文不好的话可以谷歌浏览器在线翻译.http://www.cplusplus.com ...

  7. Spring Cloud Eureka源码分析之三级缓存的设计原理及源码分析

    Eureka Server 为了提供响应效率,提供了两层的缓存结构,将 Eureka Client 所需要的注册信息,直接存储在缓存结构中,实现原理如下图所示. 第一层缓存:readOnlyCache ...

  8. aha

    欢迎使用 MWeb MWeb 是专业的 Markdown 写作.记笔记.静态博客生成软件,目前已支持 Mac,iPad 和 iPhone.MWeb 有以下特色: 软件本身: 使用原生的 macOS 技 ...

  9. Windows 数据盘自动分区脚本

    在CMD命令文本下执行,即可: diskpart //1.进入diskpart模式 list disk //2.查询磁盘 select disk 1 //3.选择磁盘 create partition ...

  10. Centos7查看防火墙对应的开放端口以及进行端口操作

    1.查看开放端口列表 [root@host bin]# firewall-cmd --list-ports 22/tcp 80/tcp 8888/tcp 39000-40000/tcp 12888/t ...