题意:

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. Jenkins+Gitlab+Ansible自动化部署(五)

    Freestyle Job实现静态网站部署交付(接Jenkins+Gitlab+Ansible自动化部署(四)https://www.cnblogs.com/zd520pyx1314/p/102445 ...

  2. java jmap

    jmap : 命令用于生成堆转储快照.它还可以查询finalize执行队列.Java堆和永久代的详细信息,如空间使用率.当前用的是哪种收集器等. 命令格式: jmap [option] vmid op ...

  3. GDI绘制图形的使用_验证码

    //创建GDI对象 Graphics g = this.CreateGraphics();// new Graphics(); //创建画笔对象 Pen pen = new Pen(Brushes.R ...

  4. VS2010/OpenGL配置

    1.下载glut:http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip 2.把解压得到的glut.h放到"C:\ ...

  5. Kendo MVVM 数据绑定(七) Invisible/Visible

    Kendo MVVM 数据绑定(七) Invisible/Visible Invisible/Visible 绑定可以根据 ViewModel 的某个属性来显示/隐藏 DOM 元素.例如: <d ...

  6. Ubuntu 16.04 server版本开机启动脚本不支持

    Ubuntu16.04开机启动的脚本一直不支持,错误用在将开机启动脚本放到了home/usr/的目录下,应该放到/root才能正常启动.#!/bin/sh -e ## rc.local## This ...

  7. Selenium3+webdriver学习笔记2(常用元素定位方式,定位单个元素共8种,总共有23种)

    #!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriver import time,os # about:ad ...

  8. python之删除指定目录指定日期下的日志文件

    #=======================================================================================20190521以下脚本 ...

  9. 【Python图像特征的音乐序列生成】关于数据库到底在哪里下载

    毕竟原网站一个是14年前的一个是16年前的…… 1,http://ifdo.ca/~seymour/nottingham/nottingham.html 这个网站可以下载zip包. 2,https:/ ...

  10. IE浏览器已经卸载,但是桌面上的图标却无法删除的解决方案

    第一步——win+R运行[regedit],打开注册表. 第二步——在注册表里面依次找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVer ...