DLUTOJ 1209 字典序和r-子集

传送门

Time Limit: 6 Sec  Memory Limit: 128 MB
Submit: 73  Solved: 14

Description

Input

多组输入数据。

每组数据:

第一行两个整数n,r(1 <= r <= n <= 1000000)。

第二行r个不同的整数表示:集合S的一个r子集。

Output

每组数据输出一个整数表示有多少r子集小于给定的r子集。结果mod 1000000007(1e9 + 7)。

Sample Input

3 2 2 3 3 1 2

Sample Output

2 1

HINT

Source

sspa

----------------------------------------------------------------------------------------------

Solution:

对于\(S=\{1, 2, ..., n\}\)的两个r子集\(A, B,B<A\)的条件是只属于$A$或只属于$B$的元素中最小的那个元素$x$属于$B$。

因此我们可以枚举$x$,$B$中小于$x$的元素也在$A$中,大于$x$的元素可以在$(x, n]$上任意选取。

设$A$的元素为:

  $1\le a_{1}<a_{2}<a_{3}<\dots<a_{r}\le n$

另外设$a_{0}=0$

时间: 2024-10-10 03:11:35

DLUTOJ 1209 字典序和r-子集的相关文章

R子集subset

> x<-c(6,1,2,3,NA,12) > x[x>5]    #x[5]是未知的,因此其值是否大于5也是未知的 [1]  6 NA 12 > subset(x,x>5)  #subset直接会把NA移除 [1]  6 12 > subset(airquality, Temp > 80, select = c(Ozone, Temp)) Ozone Temp 29     45   81 35     NA   84 36     NA   85 38 

子集生成问题

给你一个可比较大小顺序的集合,让你生成所有按照字典序排列的子集,本文借鉴自刘汝佳算法入门经典. 方法一: 增量构造法:一次选取一个元素到集合中. #include <iostream> using namespace std; int a[20]; /*递归输出n以内所有的子集,其中cur为当前下标,初始值0*/ void print_subset(int n,int* a,int cur){ for (int i=0;i<cur;i++)//每次递归输出当前子集,靠它来最后输出上一层指

[经典算法] 排列组合-N元素集合的所有子集(二)

题目说明: 给定一组数字或符号,按照字典序产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}.{1}.{1,2}.{1,2,3}.{1,3}.{2}.{2,3}.{3}. 题目解析: 如果要产生字典顺序,例如若有4个元素,则: {} => {1} => {1,2} => {1,2,3} => {1,2,3,4} => {1,2,4} => {1,3} => {1,3,4} => {1,4} => {2} => {2,3}

USACO 2018 December Contest Platinum T2: Sort It Out

题目大意 FJ有 N(1≤N≤1e5 )头奶牛(分别用 1…N 编号)排成一行.FJ喜欢他的奶牛以升序排列,不幸的是现在她们的顺序被打乱了.在过去FJ曾经使用一些诸如“冒泡排序”的开创性的算法来使他的奶牛排好序,但今天他想偷个懒.取而代之,他会每次对着一头奶牛叫道“按顺序排好”.当一头奶牛被叫到的时候,她会确保自己在队伍中的顺序是正确的(从她的角度看来).当有一头紧接在她右边的奶牛的编号比她小,她们就交换位置.然后,当有一头紧接在她左边的奶牛的编号比她大,她们就交换位置.这样这头奶牛就完成了“按

人造奇迹——二进制位运算的运用

最后更新:2014年4月30日 1.位运算包括: 这个我觉得大家都会我就随便说下: 位与&,如 101 & 110 = 100 位或|,如 100 | 110 = 110 位非~,如 ~101 = 010 位异或^,如 101 ^ 110 = 011 左移<<,如 011 << 1 = 110 右移>>,如 110 >> 1 = 011 其中,负数位运算的时候,用的是补码而不是原码请注意. 左移的时候,高位溢出的将会被舍弃,低位补0.如 11

Codeforces Round #615 (Div. 3). B - Collecting Packages

题面:https://codeforces.com/contest/1294/problem/B 题目大意: 机器人从(0,0)开始,他只能往上'U'或者往右'R'走 坐标系中有着很多包裹,分别在一些点上 机器人需要走过去把这些包裹全部收集起来 问能不能做到 如果能,再输出移动方式,相同移动方式输出字典序最小的方案 解题思路: pair或者结构体排序,x与y的优先级任意,因为下一个包裹必定在当前机器人位置右方/上方/右上方 否则直接输出NO,表示不可能存在这种移动方式 在输出移动方式时,注意能先

Advanced R之构造子集

构造子集 R构造子集的操作功能强大而且速度快.精通构造子集者可以用简洁的方式表达复杂的操作,很少有其他语言能做到这一点.构造子集学习起来比较困难,因为需要掌握一系列相互关联的概念: 3种构造子集操作符. 6类子集. 不同对象(比如向量.列表.因子.矩阵.数据框)行为上的重要不同. 联合使用构造子集与赋值. 本章将帮助掌握构造子集,让我们从最简单的构造子集开始:用[构造原子向量的子集.然后逐渐扩展你的知识,首先学习更加复杂的数据类型(比如数组和列表),然后是其他构造子集操作符,[[和$.接着你将学

与R纠缠的两件事——rownames和子集--转载

与R语言纠缠了一个星期,从快速上手的暗暗得意,到之后某些细节的纠结烦躁,过山车式体验中,我逐渐才认识了真实的R语言. 期间遇到两个很烦恼的问题,一个是让人烦躁抓狂,另一个是无意发现的重大错误. 1.      令人抓狂的rownames 若数据矩阵datamatrix如图1,无列名和行名及表头.若c1~c4分别为colnames,而r1~r5为rownames,表头为A. 图1:datamatrix 如何添加c1~c4?r1~r5? coln = c("c1","c2&quo

约翰霍普金斯大学数据科学系列课程——R语言:提取子集

在R语言中,有下面三种操作符可以提取对象的子集: ? "["通常返回的对象与原对象的类型相同:它也可以返回一个对象中的多个元素 ? "[["用来从列表(list)或数据框(data.frame)中提取对象:也可从列表或数据框中提取单个元素,且返回对象的类型可以不为列表和数据框. ? "$"可以通过名称从列表和数据框中提取元素:如果仅从抽取元素的角度来看,和"[["没有区别 (1) 向量 向量可以使用"[]"