博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1293:[SCOI2009]生日礼物——题解
阅读量:6739 次
发布时间:2019-06-25

本文共 1233 字,大约阅读时间需要 4 分钟。

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

小布生日快到了,于是小西打算剪一段彩带送给小布。为了让礼物彩带足够漂亮,小西希望这一段彩带中能包含所有种类的彩珠。同时,为了方便,小西希望这段彩带尽可能短,你能帮助小西计算这个最短的长度么?彩带的长度即为彩带开始位置到结束位置的位置差。

一个很简单的单调队列,对每个彩珠位置进行排序,然后从左往右扫,开一个桶记录我们加进来的每一种彩珠的个数,同时统计加进来的彩珠种类数,当与队首相同种类的彩珠个数>=2的时候我们就可以放心把队首弹出了。

#include
#include
#include
#include
#include
using namespace std;const int N=1e6+5;inline int read(){ int X=0,w=0;char ch=0; while(ch<'0'||ch>'9'){w|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9')X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return w?-X:X;}int n,k,m,q[N][2],p[65];struct node{ int pos,k;}a[N];bool cmp(node a,node b){ return a.pos
=2)p[q[l++][1]]--; if(ok==k)ans=min(ans,q[r-1][0]-q[l][0]); } return ans;}int main(){ n=read(),k=read(); for(int i=1;i<=k;i++){ int t=read(); for(int j=1;j<=t;j++)a[++m]=(node){read(),i}; } sort(a+1,a+m+1,cmp); printf("%d\n",solve()); return 0;}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +欢迎访问我的博客:+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8569545.html

你可能感兴趣的文章
Linux挂载NTFS硬盘错误解决办法
查看>>
【office培训】【王佩丰】Excel2010视频教程第4讲:排序与筛选
查看>>
手电筒项目开发一闪光灯
查看>>
php 倒序读取txt 文件中最后几行的内容,带分页
查看>>
http_proxy
查看>>
竖向滑动标签DEMO
查看>>
centos7 安装nmon
查看>>
Java常见面试题
查看>>
Spring cache详解
查看>>
单点登陆SSO实现方式浅谈
查看>>
3D打印:三维智能数字化创造(全彩)
查看>>
Kettle学习笔记(四)
查看>>
Android Message 及其使用
查看>>
RHEL6服务器kickstart无人值守安装服务
查看>>
myisam和innodb两种引擎的区别
查看>>
spring初始化bean的顺序
查看>>
Office Online 体验
查看>>
vim常用操作
查看>>
Putty使用密钥自动登陆SSH
查看>>
Nginx 502gateway错误故障解决
查看>>