【bzoj1293】【SCOI2009】【生日礼物】
2016-08-17 22:28
316 查看
题目大意
在坐标轴上有不同种类的一些点,求最短的区间包含所有种类的点。
解题思路
可以考虑找到第一个合法区间,当左指针右移时有可能是某一些种类没被包含,这时我们可以加入下一个当前种类的点,每个点只会被加入一次,因此O(n)。
code
#include<set> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #define LF double #define LL long long #define fo(i,j,k) for(int i=j;i<=k;i++) #define fd(i,j,k) for(int i=j;i>=k;i--) using namespace std; int const maxn=1000000,maxk=60,inf=2147483647; int n,k,t[maxk+10],p[maxk+10],a[maxn+1]; int main(){ freopen("d.in","r",stdin); freopen("d.out","w",stdout); scanf("%d%d",&n,&k); fo(i,1,k){ scanf("%d",&t[i]);p[i]=a[0]+1; fo(j,1,t[i])scanf("%d",&a[++a[0]]); t[i]=a[0]; } int mi=inf,mx=-inf; fo(i,1,k)mi=min(mi,a[p[i]]),mx=max(mx,a[p[i]]); int ans=mx-mi; for(;1;){ int mi=inf,pos; fo(i,1,k) if(a[p[i]]<mi){ mi=a[p[i]]; pos=i; } if(p[pos]!=t[pos]){ p[pos]++; int mi=inf,mx=-inf; fo(i,1,k){ if(a[p[i]]<mi)mi=a[p[i]]; if(a[p[i]]>mx)mx=a[p[i]]; } if(mx-mi<ans)ans=mx-mi; }else{ printf("%d",ans); return 0; } } return 0; }
相关文章推荐
- bzoj 1293: [SCOI2009]生日礼物 STL
- bzoj 1293: [SCOI2009]生日礼物 暴力
- BZOJ1293: [SCOI2009]生日礼物
- bzoj 1293: [SCOI2009]生日礼物
- [BZOJ 1293][SCOI2009]生日礼物:单调队列
- 【BZOJ】1293 [SCOI2009]生日礼物 (这题有多种解法)
- [bzoj1293][SCOI2009]生日礼物(单调队列)
- [BZOJ] 1293 - [SCOI2009] - 生日礼物 - 离散化 - 尺取法 - 状态压缩
- [BZOJ1293]SCOI2009生日礼物|贪心
- [BZOJ1293][SCOI2009]生日礼物(单调队列)
- 【bzoj 1293】[SCOI2009]生日礼物(乱搞|单调队列)
- BZOJ1293: [SCOI2009]生日礼物
- BZOJ系列1293《[SCOI2009]生日礼物》题解
- 【BZOJ1293】【SCOI2009】生日礼物
- 【bzoj 1293】[SCOI2009]生日礼物
- [bzoj-1293][SCOI2009]生日礼物 题解
- [bzoj 1293][SCOI2009] 生日礼物
- BZOJ 1293: [SCOI2009]生日礼物【单调队列】
- bzoj 1293: [SCOI2009]生日礼物
- BZOJ1293:[SCOI2009]生日礼物——题解