题意:

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)的更多相关文章

  1. 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 ...

  2. hdu 6301 Distinct Values (贪心)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. 2018 Multi-University Training Contest 1 Balanced Sequence(贪心)

    题意: t组测试数据,每组数据有 n 个只由 '(' 和 ')' 构成的括号串. 要求把这 n 个串排序然后组成一个大的括号串,使得能够匹配的括号数最多. 如()()答案能够匹配的括号数是 4,(() ...

  4. hdu 6301 Distinct Values(贪心)题解

    题意:长为n的串,给你m个区间,这些区间内元素不重复,问这样的串字典序最小为? 思路:用set保存当前能插入的元素,这样就能直接插入最小元素了.对操作按l排序,因为排过的不用排,所以两个指针L,R是一 ...

  5. 2017 Multi-University Training Contest - Team 2 TrickGCD(组合数学)

    题目大意: 给你一个序列An,然后求有多少个序列Bn 满足Bi<=Ai,且这个序列的gcd不为1 题解: 考虑这样做 枚举一个因子k,然后求出有多少个序列的gcd包含这个因子k 然后把结果容斥一 ...

  6. 2019 Multi-University Training Contest 1 A.Blank(dp)

    题意:现在要你构造一个只有{0,1,2,3} 长度为n且有m个限制条件的序列 问你方案数 思路:dp[i][j][k][now]分别表示四个数最后出现的位置 最后可以滚动数组 优化一下空间 ps:我的 ...

  7. 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 ...

  8. HDU6301 Distinct Values (多校第一场1004) (贪心)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. hdu 6301 Distinct Values (思维+set)

    hdu 6301 Distinct Values 题目传送门 题意: 给你m个区间,让你求出一个长度为n的区间且满足在这些区间的数不重复, 并且要求字典序最小 思路: 如果我们已经求出这个序列了,你会 ...

随机推荐

  1. springMVC框架的理解加深,个人的一些想法

    一 写spring-boot整合的时候,有种想看源码的冲动!呸,是钻牛角尖的毛病犯了... @RequestMapping("/index") public String inde ...

  2. @Primary 使用

    造轮子的一个小小的发现 当一个接口被两个service实现时,controller调用接口实现功能,会报错,提示开发者指定service,官方是建议你使用@Qualifier来区分的,但是,总有另一种 ...

  3. C#知识点-StopWatch-计时

    目录 简单介绍 基本用法 结尾 简单介绍 Stopwatch 可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间.一般用来测量代码执行所用的时间或者计算性能数据,在优化代码性能上可以使 ...

  4. Java运算符、引用数据类型、流程控制语句

    1运算符 1.1算术运算符 运算符是用来计算数据的符号. 数据可以是常量,也可以是变量. 被运算符操作的数我们称为操作数. 算术运算符最常见的操作就是将操作数参与数学计算: 运算符 运算规则 范例 结 ...

  5. 定时器 & 日期时间对象 & 正则

    1 JavaScript 计时事件 通过使用 JavaScript,有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行,这称之为计时事件. 两个关键方法是: setInterv ...

  6. Java基础(变量、运算符)

    第2天 Java基础语法 今日内容介绍 u 变量 u 运算符 第1章 变量 1.1 变量概述 前面我们已经学习了常量,接下来我们要学习变量.在Java中变量的应用比常量的应用要多很多.所以变量也是尤为 ...

  7. css position 定位模式

     定位 定位模式: static relative absolute fixed 边偏移 :top bottom left right 一般的定位必须要有定位模式以及边偏移 static 静态定位 默 ...

  8. SQL Server扩展事件system_health会话总结

    system_health会话概念 我们知道扩展事件(Extended Events)是从SQL Server 2008开始引入的.system_health会话是SQL Server默认包含的扩展事 ...

  9. 洛谷 P2691 逃离

    题目描述 一个n×n栅格是由n行和n列顶点组成的一个无向图,如图所示.用(i,j)表示处于第i行第j列的顶点.除了边界顶点(即满足i=1,i=n,j=1或j=n的顶点(i,j)),栅格中的所有其他顶点 ...

  10. UWP开发:自动生成迷宫&自动寻路算法(2)

    之后我们编写一个类,同时创建一个List,将List与前端的Rectangle绑定. public static List<Rect> Rects { get; set; }Rects = ...