题目描述

在虚拟国度里多了很多 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. 侵入式&非侵入式

    侵入式设计 引入了框架,对现有的类的结构有影响:即需要实现或继承某些特定类. 例如:Struts框架 非侵入式设计 引入了框架,对现有的类结构没有影响. 例如:Hibernate框架 / Spring ...

  2. 基于jar的Spring Boot工程

    一.Spring Boot简介 Spring Boot是由Pivotal[ˈpɪvətl]团队(一家做大数据的公司)提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架 ...

  3. Spring Boot项目的探究

    一.pom.xml文件 1.父项目 <parent> <groupId>org.springframework.boot</groupId> <artifac ...

  4. MVC+Servlet+mysql+jsp读取数据库信息

    首先有以下几个包: 1.controller 控制层,对用户的请求进行响应 2.dao 数据层接口标准 3.daoimpl 数据层实现层 4.model 实体类层 5.service 业务层接口标准 ...

  5. JUC概述

    JUC概述1: 首先是进程和线程的概念: 进程:是指系统在系统中正在运行的一个应用程序,程序一旦运行就是进程,进程是资源分配的最小单位 线程:进程之内独立执行,是程序执行的最小单位 线程的六大状态:在 ...

  6. numpy基础教程--where函数的使用

    在numpy中,where函数是一个三元运算符,函数原型为where(condition, x, y),意思是当条件成立的时候,将矩阵的值设置为x,否则设置为y 一个很简单的应用就是,在一个矩阵当中, ...

  7. 基于Github Actions + Docker + Git 的devops方案实践教程

    目录 为什么需要Devops 如何实践Devops 版本控制工具(Git) 学习使用 配置环境 源代码仓库 一台配置好环境的云服务器 SSH远程登录 在服务器上安装docker docker技术准备工 ...

  8. 磁盘管理LVM

    目录 一.简介 二.操作 环境简介 操作 一.简介 LVM全称为Logical Volume Management,它是Linux环境下对磁盘分区进行管理的一种机制,它可以将多个硬盘合成一个资源池,然 ...

  9. Office365与Office2016差异汇总

    以下很多链接来自原来的博客,如果有哪篇"被色情"的,请留言联系我,谢谢! 2020-8-29更新 通用 图片透明度:http://blog.sina.com.cn/s/blog_5 ...

  10. LuoguP7072 [CSP-J2020] 直播获奖 题解

    Update \(\texttt{2020.11.13}\) 修改了一个小细节. \(\texttt{2020.11.16}\) 修改了一个错误. Content 有一场 \(n\) 个人的比赛,计划 ...