传送门

题目:

Description

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

Input

第一行包含两个整数N, K,分别表示彩珠的总数以及种类数。接下来K行,每行第一个数为Ti,表示第i种彩珠的数目。接下来按升序给出Ti个非负整数,为这Ti个彩珠分别出现的位置。

Output

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

Sample Input

6 3
1 5
2 1 7
3 1 3 8

Sample Output

3

HINT

有多种方案可选,其中比较短的是1~5和5~8。后者长度为3最短。
【数据规模】
对于50%的数据, N≤10000;
对于80%的数据, N≤800000;
对于100%的数据,1≤N≤1000000,1≤K≤60,0≤彩珠位置<2^31。

题解:

写法大意:单调队列

sort一遍保证位置的单调性,开一个pos数组存第i种彩带最后出现的位置,出队的时候判断一下那个元素的位置是否与pos数组相同即可(不同才能出队)

就样例来模拟一波:

6 3
1 5
2 1 7
3 1 3 8

进行排序以后的f数组:

f[i].x 2 3 3 1 2 3
f[i].y 1 1 3 5 7 8

(pos数组要先初始化为-1)

(len要初始化为f[n].y-f[1].y,即最坏的情况(否则会有5个点挂掉(luogu会,bzoj没试过)))

当i=1时

pos[f[i].x]为-1,那么f[i]入队,队列中的珠子多了一个了,cnt++

更新pos[f[i].x]的值为f[i].y

开始出队操作:

当队头head<=队尾i且队头的元素所在位置f[head].y!=该位置珠子最后出现的位置(即pos[f[head].x])时就可以出队了!

最后更新一下答案:

当cnt(队列内珠子种数)=k(珠子种数)时就可以更新答案了!

len=min(len,f[i].y-f[head].y)

这样从头枚举到尾就好了,时间复杂度(nlogn)(排序需要nlogn的时间复杂度)

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll int
#define min(x,y) x<y?x:y
inline void read(ll &x){
x=;ll f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-f;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
x*=f;
}
using namespace std;
#define N 1000010
struct node{ll x,y;}f[N];
//x表示所属彩珠类型,y表示w位置
ll n,k,len,pos[N];
bool cmp(node x,node y){return x.y<y.y;}
int main(){
read(n);read(k);ll a,b=;
for(ll i=;i<=k;i++){
read(a);pos[i]+=a;
for(ll j=;j<=a;j++){
read(f[++b].y);
f[b].x=i;
}
}
sort(f+,f+n+,cmp);
len=f[n].y-f[].y;ll head=,cnt=;
memset(pos,-,sizeof(pos));
for(ll i=;i<=n;i++){
if(pos[f[i].x]==-)cnt++;
pos[f[i].x]=f[i].y;
while(head<=i&&f[head].y!=pos[f[head].x])head++;
if(cnt==k&&f[i].y-f[head].y<len)len=f[i].y-f[head].y;
}
printf("%d",len);
return ;
}

再提供一个本质上没有区别但是长得比较好看的代码(我以前码风好丑啊

#include <bits/stdc++.h>

using namespace std ;

#define N 1000010

int n , k ;
int last[ N ] ;
struct node {
int id , x ;
}a[ N ] ; bool cmp( node a , node b ) {
return a.x < b.x ;
} int main() {
scanf( "%d%d" , &n , &k ) ;
int tot = ;
for( int i = ; i <= k ; i ++ ) {
int t ;
scanf( "%d" , &t ) ;
for( int j = ; j <= t ; j ++ ) {
scanf( "%d" , &a[ ++ tot ].x ) ;
a[ tot ].id = i ;
}
}
sort( a + , a + n + , cmp ) ;
int l = , ans = a[ n ].x - a[ ].x , cnt = ;
for( int i = ; i <= n ; i ++ ) {
if( !last[ a[ i ].id ] ) cnt ++ ;
last[ a[ i ].id ] = a[ i ].x ;
while( last[ a[ l ].id ] != a[ l ].x && l <= i ) l ++ ;
if( cnt == k && a[ i ].x - a[ l ].x < ans ) ans = a[ i ].x - a[ l ].x ;
}
printf( "%d\n" , ans ) ;
return ;
}

转载请注明出处哈:http://www.cnblogs.com/henry-1202/p/8666497.html

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

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

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

  2. BZOJ 1293 SCOI2009 生日礼物 堆

    题目大意:给定一个数轴上n个点,每一个点有一种颜色,一共k种颜色.求一个最短的区间,包括全部k种颜色 卡了一段时间0.0 一開始想二分答案啥的 后来发现数据范围太大写不了0.0 后来去找题解才发现尼玛 ...

  3. bzoj 1293: [SCOI2009]生日礼物 问题转化 + 性质分析 + 滚动数组优化

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

  4. 1293: [SCOI2009]生日礼物

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

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

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

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

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

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

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

  8. [BZOJ 1293] 生日礼物

    Link: BZOJ 1293 传送门 Solution: 这题直接上尺取法就行了吧 先将每种颜色第一个放入优先队列,用$mx$维护当前的末尾位置 每次取出第一个颜色,更新答案.将其下一个放入队列中去 ...

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

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

随机推荐

  1. 58 同城 iOS 客户端 iOS11 及 iPhone X 适配实践

    一.前言 前段时间 WWDC 大会上苹果推出了 iOS11 系统 和 iPhone X 新机型,相信各个 iOS 团队的开发者都已经在计划新系统和新机型的适配工作了.不得不说,新系统和新机型的发布确实 ...

  2. Struts2 之 Action 类访问 WEB 资源

    接着上次博客的内容我继续分享我所学到的知识,和自己在学习过程中所遇到问题以及解决方案.当然,如果读者发现任何问题均可以在下方评论告知我,先谢! 在 Action 中访问 WEB 资源 web 资源 所 ...

  3. javaScript设计模式-创建型设计模式

    我们大家一听到设计模式就感觉设计模式是一个高端的东西,到底什么是设计模式呢?其实设计模式也就是我们的前辈在写代码的时候遇到的问题,提出的解决方案,为了方便人与人之间的交流,取了个名字,叫做设计模式. ...

  4. python全栈学习--day5

    字典 特点:字典是python中唯一的映射类型,采用键值对(key-value) 的形式存数据. 存储大量的数据,是关系型数据,查询数据快. 字典初始说明: 遍历字典从列表开始,列表是从头便利到尾的. ...

  5. 【java并发系列】Fork/Join任务(转)

    原文链接 当我们需要执行大量的小任务时,有经验的Java开发人员都会采用线程池来高效执行这些小任务.然而,有一种任务,例如,对超过1000万个元素的数组进行排序,这种任务本身可以并发执行,但如何拆解成 ...

  6. IntelliJIDEA中如何使用JavaDoc

    IntelliJ IDEA 12.1.6,本身提供了很好的 JavaDoc 生成功能,以及标准 JavaDoc 注释转换功能,其实质是在代码编写过程中,按照标准 JavaDoc 的注释要求,为需要暴露 ...

  7. 【前端】wangEditor(富文本编辑器) 简易使用示例

    转载请说明作者或者注明出处,谢谢 说到前端常用的编辑器,自然也少不了富文本编辑器(RichText Editor) 笔者在此之前也看了一些相关的在线编辑器,其中包括了当百度搜索“富文本编辑器”字样时出 ...

  8. python中functools.singledispatch的使用

    from functools import singledispatch @singledispatch def show(obj): print (obj, type(obj), "obj ...

  9. scrapy crawl rules设置

    rules = [ Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'), restrict_xpaths=('//li[@clas ...

  10. day-2 如何搭建一个github代码库

    最近在听尤瓦尔·赫拉利代写的两本书<人类简史>和<未来简史>两本书评,一部描述人类从哪里来,一部描述人类将往哪里去,书中阐述以前我们经历的饥饿.疾病和战争已经渐渐逝去,未来我们 ...