Description

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

题解:

十分简单,独自想出来的.
题目中要求最短的一段区间,使得该区间有所有的色块种类.
考虑枚举右端点,设该区间左端点的色块为 $i$,那么 $i$ 一定是距离右端点最近的一个 $i$ ,即 $i$ 的位置是从右端点开始数起 $i$ 首次出现的位置.
证明:
如果不是最近的,那么可以将该区间缩短,因为 $i$ 在距离右端点更近的位置有替代者.
色块只有 60 个,考虑将坐标离散化暴力转移即可,途中顺便维护距离每一个坐标距离最远且第一次出现的距离,所有点中该值的最小值就是答案.

直接开数组会炸掉,滚动优化一下即可.

Code:

#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1010000
#define inf 0x7fffffff
using namespace std;
void Min(int &a,int b)
{
if(b<a) a=b;
}
void Max(int &a,int b)
{
if(b>a) a=b;
}
struct Node
{
int id,d;
Node(int a=0,int b=0):id(id),d(d){}
}nodes[maxn];
bool cmp(Node a,Node b)
{
return a.d<b.d;
}
int arr[maxn],lst[2][61];
int main()
{
// setIO("input");
int n,k,m,cnt=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=k;++i)
{
int t,x;
scanf("%d",&t);
for(int j=1;j<=t;++j)
{
scanf("%d",&x);
nodes[++cnt].id=i, nodes[cnt].d=x;
}
}
sort(nodes+1,nodes+1+n,cmp);
for(int i=1;i<=n;++i) arr[i]=nodes[i].d;
for(int j=0;j<=60;++j) lst[0][j]=lst[1][j]=inf;
for(int i=1;i<=n;++i)
{
nodes[i].d=lower_bound(arr+1,arr+1+n,nodes[i].d)-arr;
}
int ans=inf, cur=0;
for(int i=1,j;i<=n;i=j+1)
{
j=i;
int posl=nodes[i-1].d;
int posc=nodes[i].d;
int rec=0;
while(nodes[j+1].d==nodes[i].d) ++j;
for(int jj=i;jj<=j;++jj) lst[cur][nodes[jj].id]=0;
for(int jj=1;jj<=k;++jj)
{
if(lst[cur^1][jj]!=inf)
{
Min(lst[cur][jj],lst[cur^1][jj]+arr[posc]-arr[posl]);
}
rec=max(rec,lst[cur][jj]);
}
for(int j=0;j<=60;++j) lst[cur^1][j]=inf;
cur^=1;
Min(ans,rec); }
printf("%d",ans);
return 0;
}

  

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] 生日礼物

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

  3. BZOJ 1293 SCOI2009 生日礼物 堆

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

  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. BZOJ 1108: [POI2007]天然气管道Gaz 性质分析_小结论_巧妙

    Description Mary试图控制成都的天然气市场.专家已经标示出了最好的天然气井和中转站在成都的地图.现在需要将中转 站和天然气井连接起来.每个中转站必须被连接到正好一个钻油井,反之亦然. M ...

  7. BZOJ 1112: [POI2008]砖块Klo Splay + 性质分析

    Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...

  8. bzoj 1106 [POI2007]立方体大作战tet 树状数组优化

    [POI2007]立方体大作战tet Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 821  Solved: 601[Submit][Status][ ...

  9. BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)

    题目链接 dp进阶之CDQ分治优化dp. 前置技能:dp基本功底,CDQ分治,树状数组. 问题等价于求二维最长上升子序列,是一个三维偏序问题(时间也算一维). 设$dp[i]=(l,x)$为以第i枚导 ...

随机推荐

  1. 百度之星2014资格赛 1004 - Labyrinth

    先上题目: Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  2. 如何让 Windows 上的命令行工具更好用

    侯爵老师视频详解:如何让 Windows 上的命令行工具更好用 很多 Windows 用户在打开这个小黑窗时,都会情不自禁的感慨,「实在是太丑了--」 实际上如果你用的是 Windows 8 或 Wi ...

  3. 格式化LInux后开机进入grub怎么办

    问题:格式化Linux系统盘之后,重启进入grub 1.grub 引导进入windows系统 进入grub grub>rootnoverify (hd0,1) [可以使用Tab键( 比如 roo ...

  4. Meteor 前端 RESTful API 通过后端 API 下载文件

    Meteor 下载文件 问题场景 后端 HTTP server提供一个下载接口,可是须要前端 Meteor 可以给浏览器用户开一个URL来下载这个文件. 举例:在线的Meteor Logo文件就好比后 ...

  5. 使用makeself创建安装文件

    Makeself.sh是一个小的Shell脚本.用于从一个文件夹中生成自解压的tar.gz压缩包. 结果文件以一个shell脚本显示(大多数以.run作为后缀名).能够自己主动执行.该文档会解压自己到 ...

  6. 什么是A记录、MX记录、CNAME记录具体介绍

    什么是A记录: A (Address) 记录是用来指定主机名(或域名)相应的IP地址记录.用户能够将该域名下的站点服务器指向到自己的web server上. 同一时候也能够设置域名的子域名. 通俗来说 ...

  7. 几个比較好的IT站和开发库官网

    几个比較好的IT站和开发库官网 1.IT技术.项目类站点 (1)首推CodeProject,一个国外的IT站点,官网地址为:http://www.codeproject.com,这个站点为程序开发人员 ...

  8. 大数据DDos检测——DDos攻击本质上是时间序列数据,t+1时刻的数据特点和t时刻强相关,因此用HMM或者CRF来做检测是必然! 和一个句子的分词算法CRF没有区别!

    DDos攻击本质上是时间序列数据,t+1时刻的数据特点和t时刻强相关,因此用HMM或者CRF来做检测是必然!——和一个句子的分词算法CRF没有区别!注:传统DDos检测直接基于IP数据发送流量来识别, ...

  9. MongoDB如何实现读写分离

    MongoDB如何实现读写分离 MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对 ...

  10. WEEX学习网站

    https://github.com/alibaba/weex https://alibaba.github.io/weex/  官网     http://weex.help/topic/57792 ...