[bzoj 1293] [SCOI2009] 生日礼物
传送门
题目:
Description
Input
Output
Sample Input
1 5
2 1 7
3 1 3 8
Sample Output
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] 生日礼物的更多相关文章
- BZOJ 1293: [SCOI2009]生日礼物【单调队列】
1293: [SCOI2009]生日礼物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2534 Solved: 1383[Submit][Stat ...
- BZOJ 1293 SCOI2009 生日礼物 堆
题目大意:给定一个数轴上n个点,每一个点有一种颜色,一共k种颜色.求一个最短的区间,包括全部k种颜色 卡了一段时间0.0 一開始想二分答案啥的 后来发现数据范围太大写不了0.0 后来去找题解才发现尼玛 ...
- bzoj 1293: [SCOI2009]生日礼物 问题转化 + 性质分析 + 滚动数组优化
Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩 ...
- 1293: [SCOI2009]生日礼物
1293: [SCOI2009]生日礼物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1096 Solved: 584[Submit][Statu ...
- 1293: [SCOI2009]生日礼物 - BZOJ
Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩 ...
- bzoj1293[SCOI2009]生日礼物 尺取法
1293: [SCOI2009]生日礼物 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2838 Solved: 1547[Submit][Stat ...
- bzoj1293: [SCOI2009]生日礼物(stl堆)
1293: [SCOI2009]生日礼物 题目:传送门 题解: 据说这道题乱搞随便就水过了 本蒟蒻想到了一个用堆的水法(还专门学了学queue): 如果把每一种颜色的下一个位置都记录一下的话,一开始就 ...
- [BZOJ 1293] 生日礼物
Link: BZOJ 1293 传送门 Solution: 这题直接上尺取法就行了吧 先将每种颜色第一个放入优先队列,用$mx$维护当前的末尾位置 每次取出第一个颜色,更新答案.将其下一个放入队列中去 ...
- 【BZOJ1293】[SCOI2009]生日礼物(单调队列)
[BZOJ1293][SCOI2009]生日礼物(单调队列) 题面 BZOJ 洛谷 题解 离散之后随便拿单调队列维护一下就好了. #include<iostream> #include&l ...
随机推荐
- Matlab绘图基础——绘制等高线图
% 等高线矩阵的获取 C = contourc(peaks(20),3); % 获取3个等级的等高线矩阵 % 等高线图形的绘制 contour(peaks(20),10);c ...
- C语言第一次博客作业 陈张鑫
一,PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...
- 敏捷冲刺每日报告一(Java-Team)
第一天报告(10.25 周三) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- 团队作业4——第一次项目冲刺(Alpha版本)11.16
a. 提供当天站立式会议照片一张 举行站立式会议,讨论项目安排: 整理各自的任务汇报: 全分享遇到的困难一起讨论: 讨论接下来的计划: b. 每个人的工作 (有work item 的ID) 1.前两天 ...
- iOS开发-即时通信XMPP
1. 即时通信 1> 概述 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷,服务提供商也提供了越来越丰富的通讯服务功能 ...
- zookeeper入门系列:paxos协议
上一章讨论了一种强一致性的情况,即需要分布式事务来解决,本章我们来讨论一种最终一致的算法,paxos算法. paxos算法是由大牛lamport发明的,关于paxos算法有很多趣事.比如lamport ...
- slf4j 与 log4j2 实战讲解与日志分割
这两天搭建项目的时候用到log4j2在这里把自己的问题与了解拿出来与大家分享一下. 1.为什我要用 因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见几种日志系统,而使用l ...
- 利用java反射读写csv中的数据
前一段有个需求需要将从数据库读取到的信息保存到csv文件中,在实现该需求的时候发现资料比较少,经过收集反射和csv相关资料,最终得到了如下程序. 1.在使用java反射读取csv文件数据时,先通 ...
- JAVA_SE基础——8.基本数据类型
基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...
- 新概念英语(1-131)Don't be so sure
Lesson 131 Don't be so sure! 别那么肯定! Listen to the tape then answer this question. What's the problem ...