原题链接:https://www.luogu.com.cn/problem/P2564

生日礼物

题目背景

四川2009NOI省选

题目描述

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

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

输入格式

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

输出格式

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

输入输出样例

输入 #1
6 3
1 5
2 1 7
3 1 3 8
输出 #1
3

说明/提示

【样例说明】

有多种方案可选,其中比较短的是1 ~ 5和5 ~ 8。后者长度为3最短。

【数据规模】

对于50%的数据, N≤10000;

对于80%的数据, N≤800000;

对于100%的数据,1≤N≤1000000,1≤K≤60,0≤0≤0≤珠子位置<231<2^{31}<231 。

∑Ti=n\sum T_i =n∑Ti​=n

题解

强化版的逛画展,思路可以说是一模一样:先找一个满足要求的区间,然后不断右移右端点,同时尝试右移左端点,更新答案。

代码

调了半天才发现右移左端点的部分忘加循环了,一次就只能移动到下一个横坐标,菜鸡流泪……

#include<bits/stdc++.h>
using namespace std;
const int M=1e6+5;
struct Ball{int pos,col;}bal[M];
bool cmp(Ball a,Ball b){return a.pos<b.pos;}
int n,k,tot,le,ri,cot[65],num,ans=INT_MAX;
void in()
{scanf("%d%d",&n,&k);for(int i=1,a;i<=k;++i){scanf("%d",&a);for(;a--;bal[tot].col=i)scanf("%d",&bal[++tot].pos);}
}
void ac()
{sort(bal+1,bal+1+n,cmp);for(le=ri=1;ri<=n;++ri){for(;bal[ri].pos==bal[ri+1].pos;++ri)if(!cot[bal[ri].col]++)++num;if(!cot[bal[ri].col]++)++num;if(num==k)break;}for(int flag,i;ri<=n;){for(flag=1;flag;){for(i=le;bal[i].pos==bal[i+1].pos;++i)if(cot[bal[le].col]<=1)flag=0;if(cot[bal[i].col]<=1)flag=0;if(flag)for(;le<=i;++le)--cot[bal[le].col];}ans=min(ans,bal[ri].pos-bal[le].pos);for(++ri;ri<=n&&bal[ri].pos==bal[ri+1].pos;++ri)++cot[bal[ri].col];++cot[bal[ri].col];}printf("%d\n",ans);
}
int main()
{in(),ac();//system("pause");
}

Luogu2564 [SCOI2009]生日礼物相关推荐

  1. P2564 [SCOI2009]生日礼物

    P2564 [SCOI2009]生日礼物 题意: n个彩珠,k个种类,分布在一个彩带上,现在要选取彩带的一部分,要求该部分包含所有种类的彩珠,且长度尽可能短,你能计算这个最短的长度吗? 1≤N≤100 ...

  2. bzoj 1293: [SCOI2009]生日礼物

    1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2380  Solved: 1290 [Submit][St ...

  3. [SCOI2009]生日礼物

    这道题很容易看出是一道单调队列题. 首先我们根据珠子的位置排序. 然后按顺序枚举一个个珠子. 如果该种珠子没有出现过标记上它的位置,如果出现过修改并打上当前位置.当所有珠子都出现后,将当前位置减去打标 ...

  4. [SCOI2009]生日礼物 双指针

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

  5. BZOJ 1293 [SCOI2009]生日礼物

    [题解] 离散化+Two Pointer. 离散化的时候有些特殊姿势. #include<cstdio> #include<vector> #include<algori ...

  6. 【每日一题】8月17日题目精讲-[SCOI2009]生日礼物

    来源:牛客网: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 小西有一条很长的彩带,彩带 ...

  7. [SCOI2009]生日礼物 单调性尺取法

    题意:给你n个k种颜色的点,每个点都有坐标和颜色两个属性,选出一个长度尽量短的区间,使得每种颜色的点都在区间内出现. 数据范围: 对于50%的数据, N≤10000: 对于80%的数据, N≤8000 ...

  8. bzoj1293 [SCOI2009]生日礼物 单调队列

    比较好想的单调队列 码: #include<iostream> #include<cstdio> #include<algorithm> #include<m ...

  9. bzoj1293: [SCOI2009]生日礼物

    这题感觉很蠢啊. 就把每个点按顺序排序,然后队列搞一下. #include<cstdio> #include<iostream> #include<cstring> ...

  10. P2564 [SCOI2009]生日礼物(尺取法/双指针)

    LINK 不得不说 双指针用法nb 题目 输入输出样例 输入 6 3 1 5 2 1 7 3 1 3 8 输出 3 思路: 建议看尺取法 代码: #include<bits/stdc++.h&g ...

最新文章

  1. BCH应用发展报告——Member正在成为趋势
  2. jackson 反序列化string_Java 中使用Jackson反序列化
  3. 一文带你了解mysql sql model的only_full_group_by模式含Error 1055问题分析
  4. 删除windows隐藏的本地连接
  5. 欢乐纪中B组周五模拟赛【2019.3.8】
  6. 《programming in scala》2ed chap9学习笔记
  7. Android中热更新实现--Sophix方案
  8. 三大迷宫生成算法 (Maze generation algorithm) -- 深度优先,随机Prim,递归分割
  9. FOI 2019 游记
  10. 腾讯、华为角逐“云游戏”
  11. 苹果发布 AI 生成模型 GAUDI,文字生成 3D 场景
  12. 行流 - 通用;仅使用库存接口开单 and 行流 - 通用;
  13. 用html和css画太极图,利用css画一个太极图(阴阳八卦)实例
  14. css 单行、两行 或 多行显示不下 省略号...表示实现
  15. .NetCore Mediator的简单使用
  16. SAP_什么是BAPI
  17. Androbench使用
  18. 用excel做一个家庭流水账本 增加一些统计功能 和大家分享
  19. 怎么卸载虚幻4_用虚幻引擎重现新海诚风格“秒速五厘米”场景(附流程和思路)...
  20. 南方人过冬有多难?用Python带你分析全网取暖器销量数据

热门文章

  1. Raki的读paper小记:A Unified MRC Framework for Named Entity Recognition
  2. win8文件共享服务器搭建,Win8系统开启公用文件夹共享的方法【图文】
  3. java linux 系统队列,linux下消息队列
  4. 简单的@Async使用 自定义连接池
  5. 技术人员,你的表达能力怎样?
  6. 细说static关键字及其应用
  7. zoj 3599 Game 博弈论
  8. 执行引擎(Execution Engine)总结
  9. MyCat的zookeeper集群模式总结
  10. spring扩展点四:SmartInitializingSingleton 补充