2018 Multi-University Training Contest 1 Distinct Values(set)
题意:
t组数据,每组数据给定n,m,
表示有m个约束,每个约束包含 x,y ,代表区间 [x, y] 里的数字不能相同。
让你用所有的正整数构成一个长度为 n 的区间,使得这个区间元素顺序的字典序最小。

这个题场上的思路是把所有的约束区间排序,然后再用优先队列维护当前可用的最小值。
后来看了dls的代码。发现我们真是弱爆了。
用suc[i]表示每一个左边界为 i 的限制最右可以向右延伸到哪里。
刚开始suc[i] = i; 表示每一个[i, i] 也是一个限制。
例如第三个样例:n = 5, m = 2: [1, 3] [2, 4] 中,suc[i] = { , 3, 4, 3, 4, 5]
用set维护当前可用的数字。开始时加入1~n。
用一个指针 r 代表当前填数到的位置。若 r <= suc[i] , 代表当前这个限制还没有填完数,继续向下执行,把用过的数字从set中删掉。
用一个L指针记录上一个处理过的区间的起始位置,填好的数组中[L,i-1]内的数值,是可以再次使用的,重新加入set中。
巧妙的是,若r < suc[i] ,代表着有一个新的限制从i 开始。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <set>
using namespace std; #define maxn 100000 + 100 int main()
{
int t;
scanf("%d", &t);
for (int i = ; i <= t; i++)
{
int n, m, a[maxn], suc[maxn];
scanf("%d%d", &n, &m); for (int i = ; i <= n; i++)
suc[i] = i; for (int i = ; i <= m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
suc[u] = max(suc[u], v);
} set<int> st;
for (int i = ; i <= n; i++)
st.insert(i); int l = , r = ;
for (int i = ; i <= n; i++)
{
if (suc[i] < r) continue;
while(l < i) st.insert(a[l++]);
while(r <= suc[i])
{
a[r] = *st.begin();
st.erase(a[r++]);
}
} for (int i = ; i < n; i++)
printf("%d ", a[i]);
printf("%d\n", a[n]);
}
}
2018 Multi-University Training Contest 1 Distinct Values(set)的更多相关文章
- 2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Ot ...
- hdu 6301 Distinct Values (贪心)
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 2018 Multi-University Training Contest 1 Balanced Sequence(贪心)
题意: t组测试数据,每组数据有 n 个只由 '(' 和 ')' 构成的括号串. 要求把这 n 个串排序然后组成一个大的括号串,使得能够匹配的括号数最多. 如()()答案能够匹配的括号数是 4,(() ...
- hdu 6301 Distinct Values(贪心)题解
题意:长为n的串,给你m个区间,这些区间内元素不重复,问这样的串字典序最小为? 思路:用set保存当前能插入的元素,这样就能直接插入最小元素了.对操作按l排序,因为排过的不用排,所以两个指针L,R是一 ...
- 2017 Multi-University Training Contest - Team 2 TrickGCD(组合数学)
题目大意: 给你一个序列An,然后求有多少个序列Bn 满足Bi<=Ai,且这个序列的gcd不为1 题解: 考虑这样做 枚举一个因子k,然后求出有多少个序列的gcd包含这个因子k 然后把结果容斥一 ...
- 2019 Multi-University Training Contest 1 A.Blank(dp)
题意:现在要你构造一个只有{0,1,2,3} 长度为n且有m个限制条件的序列 问你方案数 思路:dp[i][j][k][now]分别表示四个数最后出现的位置 最后可以滚动数组 优化一下空间 ps:我的 ...
- hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU6301 Distinct Values (多校第一场1004) (贪心)
Distinct Values Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 6301 Distinct Values (思维+set)
hdu 6301 Distinct Values 题目传送门 题意: 给你m个区间,让你求出一个长度为n的区间且满足在这些区间的数不重复, 并且要求字典序最小 思路: 如果我们已经求出这个序列了,你会 ...
随机推荐
- Linux unzip用法
1.把文件解压到当前目录下 unzip test.zip 2.如果要把文件解压到指定的目录下,需要用到-d参数. unzip -d /temp test.zip 3.解压的时候,有时候不想覆盖已经存在 ...
- 通过sqlserver sa密码修改windows操作系统密码
如果你不记得windows管理员的密码了,但知道sqlserver sa用户的密码,可以通过以下方式修改: 进入SQL之后执行以下语句: -- 允许配置高级选项 EXEC sp_configure ...
- [RDL]中多行组列组占比报表制作
结果如下: 生意额占比表达式:=iif(Fields!生意额.Value is nothing,"",Fields!生意额.Value/sum(Fields!生意额.Value, ...
- Error: Trying to open unclosed connection.
错误:试图打开未关闭的连接.在我自己写model文件的时候,重复打开了连接数据库的操作,所以报这种错误. 错误实例: 两个model文件: userModel.js var mongoose = re ...
- VS 解决方案文件结构分析
VS2013 解决方案文件结构分析 Visual Studio 的解决方案文件是一个文本文件,其中的内容不是太复杂,有些时候 Visual Studio 会把这个文件搞乱,理解一下这个文件的结构,对我 ...
- 一步步实现自己的ORM(二)
在第一篇<一步步实现自己的ORM(一)>里,我们用反射获取类名.属性和值,我们用这些信息开发了简单的INSERT方法,在上一篇文章里我们提到主键为什么没有设置成自增长类型,单单从属性里我们 ...
- Random类、ThreadLocalRandom类
Random和ThreadLocalRandom类均用于生成伪随机数. Random的构造函数: Random() 默认以系统当前时间为种子,相当于Random(System.currentT ...
- JFrame Frame 窗口关闭
JFrame是Frame的子类,即JFrame继承自Frame. JFrame是javax.swing.JFrame的类,Frame是java.awt.Frame的类. 类似的还有JButton.Bu ...
- linux debian 时间设置中无法选择“自动设定时间和日期”
没有安装ntpdate 执行:apt-get install ntpdate ntp.sjtu.edu.cn 202.120.2.101 (上海交通大学网络中心NTP服务器地址)s1a.time.ed ...
- 如何解决Eureka Server不踢出已关停的节点的问题?
如何解决Eureka Server不踢出已关停的节点的问题? eureka端: eureka.server.enable-self-preservation ...