NC20565 [SCOI2009]生日礼物

题目

题目描述

小西有一条很长的彩带,彩带上挂着各式各样的彩珠。已知彩珠有 \(N\) 个,分为 \(K\) 种。简单的说,可以将彩带考虑为 \(x\) 轴,每一个彩珠有一个对应的坐标(即位置)。某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上。 小布生日快到了,于是小西打算剪一段彩带送给小布。为了让礼物彩带足够漂亮,小西希望这一段彩带中能包含所有种类的彩珠。同时,为了方便,小西希望这段彩带尽可能短,你能帮助小西计算这个最短的长度么?彩带的长度即为彩带开始位置到结束位置的位置差。

输入描述

第一行包含两个整数 \(N, K\),分别表示彩珠的总数以及种类数。

接下来 \(K\) 行,每行第一个数为 \(T_i\) ,表示第 \(i\) 种彩珠的数目。接下来按升序给出 \(T_i\) 个非负整数,为这 \(T_i\) 个彩珠分别出现的位置。

输出描述

应包含一行,为最短彩带长度。

示例1

输入

6 3
1 5
2 1 7
3 1 3 8

输出

3

备注

对于 \(50\%\) 的数据, \(N\leq 10000\);

对于 \(80\%\) 的数据, \(N\leq 800000\);

对于 \(100\%\)的数据,\(1\leq N\leq 1000000\),\(1\leq K\leq 60\),\(0\leq 珠子位置\leq 2^{31}\)。\(\sum T_i =n\)

题解

思路

知识点:离散化+尺取法。

由于位置超数组模拟的限度,因此离散化每个位置和对应的彩灯类型,节约大部分无效空间。

按位置从小到大排序,注意到对于某一段恰好合法彩带,左端点向右移,右端点不需要复位,因为右端点是以右端点之前所有端点为左端点的合法最小右端点,符合尺取法。

时间复杂度 \(O(n\log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

pair<int,int> bead[1000007];///离散化每个位置和对应的彩灯类型 60*10^6
int vis[67];///记录尺取区间的种类访问数 int main(){
std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,k;
cin>>n>>k;
int cnt = 0;
for(int i = 0;i<k;i++){
int t;
cin>>t;
for(int j = 0;j<t;j++){
int pos;
cin>>pos;
bead[cnt++] = make_pair(pos,i);
}
}
sort(bead,bead+cnt);///按位置从小到大排序 int l = 0,r = 0,sum = 0,len = ~(1<<31);
while(l<n){
while(r<n && sum<k){
if(!vis[bead[r].second]) sum++;
vis[bead[r].second]++;
r++;
}///注意r在合法区间的右侧+1位置,因为每次都是最后++,合法之后会再++
if(sum>= k) len = min(len,bead[r-1].first - bead[l].first);///注意距离而不是点个数,是两个位置的差不需要加1
vis[bead[l].second]--;
if(!vis[bead[l].second]) sum--;
l++;
}
cout<<len<<'\n';
return 0;
}

NC20565 [SCOI2009]生日礼物的更多相关文章

  1. 1293: [SCOI2009]生日礼物

    1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1096  Solved: 584[Submit][Statu ...

  2. BZOJ 1293: [SCOI2009]生日礼物【单调队列】

    1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2534  Solved: 1383[Submit][Stat ...

  3. bzoj1293[SCOI2009]生日礼物 尺取法

    1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2838  Solved: 1547[Submit][Stat ...

  4. P2564 [SCOI2009]生日礼物(尺取法)

    P2564 [SCOI2009]生日礼物 三个字.尺取法......... 坐标按x轴排序. 蓝后尺取一下.......... #include<iostream> #include< ...

  5. 【BZOJ1293】[SCOI2009]生日礼物(单调队列)

    [BZOJ1293][SCOI2009]生日礼物(单调队列) 题面 BZOJ 洛谷 题解 离散之后随便拿单调队列维护一下就好了. #include<iostream> #include&l ...

  6. bzoj1293: [SCOI2009]生日礼物(stl堆)

    1293: [SCOI2009]生日礼物 题目:传送门 题解: 据说这道题乱搞随便就水过了 本蒟蒻想到了一个用堆的水法(还专门学了学queue): 如果把每一种颜色的下一个位置都记录一下的话,一开始就 ...

  7. 1293: [SCOI2009]生日礼物 - BZOJ

    Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩 ...

  8. bzoj1293: [SCOI2009]生日礼物

    单调队列 用一个堆维护目前每个颜色在里面的点,每回取出队首点,并更新答案.一旦哪个颜色的点都被用完,跳出循环. #include<cstdio> #include<algorithm ...

  9. [bzoj 1293] [SCOI2009] 生日礼物

    传送门(bzoj) 传送门(luogu) 题目: Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应 ...

随机推荐

  1. 微服务状态之python巡查脚本开发

    背景 由于后端微服务架构,于是各种业务被拆分为多个服务,服务之间的调用采用RPC接口,而Nacos作为注册中心,可以监听多个服务的状态,比如某个服务是否down掉了.某个服务的访问地址是否改变.以及流 ...

  2. IDEA通过Jedis操作Linux上的Redis;Failed to connect to any host resolved for DNS name问题

    testPing.java public class testPing { public static void main(String[] args) { Jedis jedis = new Jed ...

  3. HttpServletResponse & HttpServletRequest

    web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse: 如果要获取客户端请求过来的 ...

  4. STM8S103F3P6 开发环境笔记

    STM8S103F3 产品手册 https://www.st.com/resource/en/datasheet/stm8s103f2.pdf 内核 16 MHz advanced STM8 core ...

  5. Linux发行版--发行版之间的关系--哲学思想--目录的命名规则及用途

    作业2 点此链接查看centos7安装 点此链接查看Ubuntu安装 点此链接查看作业3.5 点此链接查看作业7.8.9 作业1.4.6 Linux发行版--发行版之间的关系 1.Linux是什么 L ...

  6. 如何在Linux上恢复误删除的文件或目录

    Linux不像windows有那么显眼的回收站,不是简单的还原就可以了.linux删除文件还原可以分为两种情况,一种是删除以后在进程存在删除信息,一种是删除以后进程都找不到,只有借助于工具还原,这里分 ...

  7. 使用NFS作为Glance存储后端

    NFS服务介绍 NFS网络文件系统提供了一种在类UNIX系统上共享文件的方法.目前NFS有3个版本:NFSv2.NFSv3.NFSv4.CentOS7默认使用NFSv4提供服务,优点是提供了有状态的连 ...

  8. 用简单的 Node.js 后台程序浅析 HTTP 请求与响应

    用简单的 Node.js 后台程序浅析 HTTP 请求与响应 本文写于 2020 年 1 月 18 日 我们来看两种方式发送 HTTP 请求,一种呢,是命令行的 curl 命令:一种呢是直接在浏览器的 ...

  9. docker 安装和错误解决方案

    安装 x64 架构 install docker switch mirror docker desktop docker run -d -p 80:80 docker/getting-started ...

  10. SpringBoot从Eclipse添加的Tomcat容器中启动

    SpringBoot的Web项目,想要在Eclipse中的Tomcat容器中启动运行需要做下面这两处改动 pom.xml <packaging>war</packaging> ...