观察顺序

怒刷排列组合,如何解“排列组合”一类的问题 怒刷排列组合 在刷Leetcode题目时,时常会看到一些大佬提出时间复杂度为O(1)的题解,而我还在O(nm)和O(n)之间如此反复,细细品味,其实有一类题目是经常可以爆出O(1)的解法的,这一类题目背后的数学依据就是排列组合。 顾名思义,排列即排列,组合即组合,排列组合主要是用来解决做一件事情有多少种方法或者某件事发生的概率是多少的问题。例如小明从家到学校可以选择步行、骑车、坐出租车。**问题1:**小明从家到学校有几种出行方式?**问题2:**小明从家到学校再返回家中,有几种出行方式? 针对上述的两个问 阅读详情

Description

有一个编号为1…N1≤N≤10^5)的排列,小明对数列进行了M次观察(1≤M≤50,000)。每个观察结果都是某些数的一个有序序列,表示这些数出现的顺序。比方说,如果小明的一次观察结果是序列251,则25的前面,51的前面。小明的观察结果是按优先级排列的,所以他的目标是最大化X的值,使得最终完整排列顺序能够符合前X个观察结果描述的状态。当多种排列顺序都能符合前X个状态时,小明会让编号较小的数放前面。请帮助小明求出该排列。

Input

第一行包含NM
接下来的M行,每行描述了一个观察结果。
i+1行描述了观察结果i,第一个数是观察结果中的数的数量mi,后面是一列mi个整数,给出这次观察中的顺序。
所有mi的和至多为200,000

Output

输出N个空格分隔的整数,给出一个1…N的排列,为小明求出的该排列。

Sample Input

4 3

3 1 2 3

2 4 2

3 3 4 1

Sample Output

1 4 2 3

解释:这里,小明有四个数,3个观察结果。前2个观察结果可以同时被满足,但不能满足所有的规则,这意味着总共有两种可能的顺序:1 4 2 34 1 2 3,第一种是字典序较小的。

二分验证+拓扑排序,一道不错的练手题。

#include<bits/stdc++.h>
using namespace std;
#define Inc(i,L,r) for(register int i=(L);i<=(r);++i)
const int N = 1e5+10;
vector<int>G[N],vec[N*5];
int n,m,d[N];
bool vst[N],inq[N];
inline void init(){
	scanf("%d%d",&n,&m);
	Inc(i,1,m){
		int x,num;scanf("%d",&num);
		Inc(j,1,num)scanf("%d",&x),vec[i].push_back(x);
	}
}
inline bool dfs(int x){
	if(inq[x])return inq[x]=0;
	vst[x]=inq[x]=1;
	int size=G[x].size();
	Inc(i,0,size-1)if(!dfs(G[x][i]))return inq[x]=0;
	return inq[x]=0,1;
}
inline bool check(int idx){
	memset(vst,0,sizeof(vst));
	Inc(i,1,n)G[i].clear();
	Inc(i,1,idx){
		Inc(j,1,vec[i].size()-1){
			G[vec[i][j-1]].push_back(vec[i][j]);
		}
	}
	Inc(i,1,n)if(!vst[i])if(!dfs(i))return 0;
	return 1;
}
priority_queue<int,vector<int>,greater<int> >Q;
inline void topsort(int idx){
	Inc(i,1,n)G[i].clear();
	Inc(i,1,idx){
		Inc(j,1,vec[i].size()-1){
			G[vec[i][j-1]].push_back(vec[i][j]);
			++d[vec[i][j]];
		}
	}
	Inc(i,1,n)if(!d[i])Q.push(i);
	while(!Q.empty()){
		int x=Q.top();Q.pop();
		cout<<x<<" ";
		int size=G[x].size();
		Inc(i,0,size-1){
			if(!--d[G[x][i]])Q.push(G[x][i]);
		}
	}
}
inline void solv(){
	int L=1,r=m,can;
	while(L<=r){
		int Mid=L+r>>1;
		if(check(Mid))L=Mid+1,can=Mid;
		else r=Mid-1;
	}
	topsort(can);
}
int main(){
//	freopen("order.in","r",stdin);
//	freopen("order.out","w",stdout);
	init();
	solv();
	return 0;
}

 

STM32移植u8g2库(HAL库)(硬件SPI)(sh1106_128x64) STM32移植u8g2库(HAL库)(硬件SPI)(sh1106_128x64) MCU型号为STM32F103RCT6,OLED屏为中景园电子1.3寸屏,驱动芯片为sh1106,分辨率为128x64,MDK版本为V5.34。 阅读详情

相关推荐

laravel观察者模式详解

1.创建模型 php artisan make:model Models/AgentLogs <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class AgentLogs extends Model { protected $table = 'message'; protected $fillable = [ 'invoice_id', 'type', 'titl

wgchen 524

【美团杯2020】用LCS猜出1-N全排列:最长公共子序列

最长公共子序列?简单! 看了眼题目: ?????? 【题目】 蒜斜和镁团在玩一个叫做“你问你猜”的游戏(可怜去哪了?)。规则如下: 镁团手中有n个数,且恰好是 1−n 的排列。 每次询问,蒜斜需要给出一个长度不超过 100,且每个元素都在 1−n 之间的数列(不需要是排列);之后镁团会告诉蒜斜这两个数列的最长公共子序列长度。 蒜斜需要在不超过650次询问内猜出镁团手中的排列。 这对于蒜斜来说实在太困难了,因此他找到了玉树临风文质彬彬英俊潇洒神采奕奕温文尔雅风度翩翩的你,你能帮助他吗? 任务 你需要编写一个

溢流眼泪的博客 459

咨询进阶——解读40页公司战略解码方法【附全文阅读】

战略解码是将企业战略转化为可执行计划的关键过程,强调垂直和水平一致性原则。通过KPI指标设计和目标分解,确保战略在各部门和岗位有效落地。解码过程包括战略澄清、目标牵引、绩效分解和承诺签订,输出战略解码图等文件。不同部门根据责任定位(如利润中心、绩效中心)采用差异化考核方式,实现战略有效执行。

cdfunlove的博客 130

【STATA常用指令】观测值排序:sort与gsort

简介 sort命令:在STATA中对观测值(行)根据特定变量进行升序排序。 gsort命令:在STATA中对观测值(行)进行升序或降序排列(多变量时可以是升序和降序的组合)。 sort基本语句 完整代码: sort varlist [in] [, stable] 简洁代码: so varlist [in] [, stable] varlist:排列依据的变量; 当排序变量有多个时,先按第一个变量排序,然后在第一个变量观测值相同时,根据第二个变量排序,以此类推。 [in]:排序的范围; [, stab

m0_50920491的博客 2万+

HashSet和TreeSet的使用与排列顺序观察

package com.foot.class02; import java.util.Comparator; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; public final class HashTreeSet { public static void main(String[]...

footprint01的博客 913

【UE4源代码观察观察FEngineLoop中各函数的调用顺序

当启动编辑器时,Launch模块是启动模块,在Windows平台中 LaunchWindows.cpp 的 WinMain函数是入口,而 FEngineLoop 管理了程序的初始化与主循环。他的成员函数如下: public: /** * Pre-Initialize the main loop, and generates the commandline from standard Arg...

主要记录了工作之余胡乱学习的知识,大部分是入门级别的内容。 主要是为了自己未来有用到时能快速上手,相当于是个备忘录。 当然,也很开心其他人可以从中找到对自己有用的信息。^_^ 1696

低年级趣味写话——善于观察,讲究顺序

这幅图画中有九个人物,我们也可以按照从左到右的顺序观察,再对单个人物进行从上到下的观察,这个人物的身高、年龄、发型、衣服的样式和颜色,动作等等。因此,我们可以知道,写话教学是作文教学的启蒙与过渡阶段,是写作中的基础,低年级写话教学直接影响着学生升入中高年级以后的写作水平,重要性不容忽视。看图写话是低年级重要的训练项目,语文课程标准关于小学低年级写话教学的具体目标有三个:一是对写话有兴趣,写自己想说的话,写想象中的事物,写出自己对周围事物的认识和感想;当然,无论是整体或者局部的观察,都需要遵循一定的顺序

qq_40222045的博客 258

用code观察java类的初始化顺序

原创文章 类的加载顺序是java中比较重要的基础知识~! 或许你知道static肯定是优先加载的,因为它是属于类class的但是和类的实例无关的这么一个概念, 还有代码块 block和静态代码块等知识点~! 其实我觉得都 不如 自己手打一些例子 来加深印象更好 ~ 以下是我简单整理的一个例子~ /** * 看懂java初始化顺序 */ class Insect { ...

kings963的专栏 162

如何expanded time来观察信号到来的先后顺序?(仿真工具使用技巧)【Modesim/Questasim】

如何使用delta cycle来观察信号到来的先后顺序

weixin_43698385的博客 1298

【例 7.1】 创建子类对象,观察构造方法执行顺序

【例 7.1】 创建子类对象,观察构造方法执行顺序

qq_43118674的博客 245

编写Java程序,观察类启动时静态代码块和main()的执行顺序

返回本章节 返回作业目录 需求说明: 观察类启动时静态代码块和main()的执行顺序 在Book类中定义静态代码块。 在Book中分别定义一个普通实例方法和静态方法。 在Book类的静态代码块中调用静态方法。 在Book类的主方法中实例化一个Book对象。 实现思路: 观察类启动时静态代码块和main()的执行顺序的实现思路: 在静态代码块、普通实例方法、静态方法和构造方法中分别输出标记性语句。 在main()不写任何代码,观察输出结果。 在main()创建一个Book对象,观察.

杨明金的博客 5403

观察者模式(二)

观察者模式的定义 定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 认识观察者模式的六大方面: 1、目标与观察者之间的关系:一对多、一对一、多对一(要区分update方法) 2、单向依赖 3、命名建议,subject、observer、update 4、触发通知的时机:先改数据再触发,在setWeatherContent中先

兆军张博客 440

走近观察者模式

初识观察者模式:观察者模式的定义: 定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式结构图:观察者模式涉及角色: 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被

Mike_ToUp 587

观察者模式中多线程执行订阅事件并顺序执行的问题

       对事件发布订阅模式中启动线程执行操作,但又要保证线程顺序执行的一些思考和实践,在开发过程中,经常会遇到需要使用事件来触发方法执行的情况,比如CS中按钮的点击事件,鼠标移动事件,键盘监听事件等等,有时候需要执行比较耗时的任务,但并不希望阻塞主线程,导致界面卡顿,使用线程有不能保证线程像同步的执行顺序一样顺序执行,因为有时候事件是系统触发的所以没有办法等待,所以在这儿记录下这个解决思路。...

u014690615的博客 2039

ZooKeeper之观察者(watch)

原文链接:http://www.dubby.cn/detail.html?id=9028了解观察者zk中所有的读操作,getData(),getChildren()和exists(),都可以设置一个观察者。在zk中观察者(watch)的定义是:观察事件是一个一次性的触发器,会发送给设置了这个观察者的客户端,这个触发器只有在关注的数据改变时才会触发。对watch来说,有三个主要特性: 一次性触发:观察

明月阁 1783

微信小程序JavaScript函数中的异步操作顺序执行

1.前言 小程序开发中经常遇到后一个操作依赖前一个操作异步执行结果的情形。虽然JavaScript是单线程语言,但是主线程中的耗时操作通常都被放入任务队列中异步执行,避免阻塞主线程,例如: let f1 = function (sequence) { console.log("f1开始执行"); setTimeout(function () { console.log("f1执行完成"); },10) } let f2 = function (sequence) { conso

anbuqi的博客 6537

Observer (观察者) 模式

17.1 Observer模式   Observer 的意思是 “进行观察的嗯”,也就是 “观察者” 的意思。   在 Observer 模式中,当观察对象的状态发生变化时,会通知观察者。Observer 模式适用于根据对象状态进行相应处理的场景。 17.2 示例程序   这是一段简单的示例程序,观测者将观察一个会生成数值的对象,并将它生成的数值结果显示出来。不过,不同的观测者的显示方式不一样。DigitObserver 会以数字形式显示数值,而 GraphObserver 则会以简单的图示形式来显示数值。

矢落叶の博客 1654

(C++实例)定义一个哺乳动物Mammal类,再由此派生出狗Dog类,定义一个Dog类的对象,观察基类与派生类的构造函数与析构函数的调用顺序

(C++实例)定义一个哺乳动物Mammal类,再由此派生出狗Dog类,定义一个Dog类的对象,观察基类与派生类的构造函数与析构函数的调用顺序

m0_54158068的博客 6965

实验3.1 定义一个CPU类,观察构造函数和析构函数的调用顺序

题目 定义一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,有两个公有成员函数run、stop。其中,rank为枚举类型CPU_Rank,定义为enum CPU_Rank {P1=1,P2,P3,P4,P5,P6,P7},frequency为单位是MHz的整型数,voltage为浮点型的电压值。观察构造函数和析构函数的调用顺序。 AC的C++代码如下: #include<iostream> using namespace std; enum CPU_

Running Snail 7096

linux内存管理 (二) 4.2 硬件 SMP-Consistency之内存顺序模型1

内存顺序模型解读 内存顺序模型解读 内存顺序解读: 到底我们看到的内存生效的顺序是怎么样的?这个就叫内存顺序模型。 程序顺序 : 程序给出的指令的执行顺序(一般涉及到读写内存),这代表程序员的意欲。// 程序员从代码中直观看出来的顺序 内存读写顺序 : 内存真的写入数据的顺序 , 内存的读写,到 设备显示 边际作用(也就是生效,被观察到发生更改) 有一定的时间间隔 观察(生效)顺序 : 这是各个CPU(包括写入的cpu)看到的在内存中发生的顺序,请注意了,这不是内存真的写入数据

u011011827的博客 481

DRAM内存颗粒测试简介PPT课件.pptx

DRAM内存颗粒测试简介PPT课件.pptx

上一篇: 分组行动
下一篇: NOIP2011 聪明的质检员
DancingZ
博客等级 码龄9年 10粉丝 137原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值