题目背景

四川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≤Ti<2^{31}231。

题意:

横坐标上排了k种珠子,问包含了所有种类的珠子的最短区间长度。

思路:

显然最开始是要根据珠子的横坐标排序,然后每次从左到右加入一个珠子。

我们可以发现,每次加入一个珠子,队列里珠子的种类数只会变多不会变少。于是就可以拿种类数作为判断出队入队的条件。

因为本身加入一个珠子种类数就已经是递增的了所以这道题里面不需要再对队尾做别的操作了。

而对于队头,当我们发现队列中的种类数已经满k了,就可以把队头元素给删掉,直到队列中的种类数小于k。

因为只要队列中的种类数大于k,我们肯定可以通过删除一个珠子而使区间长度变短。所以每次当队列中种类个数是k的时候就是我们要进行最优选择的时候。

 #include <iostream>
#include <set>
#include <cmath>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define inf 0x7f7f7f7f const int maxn = 1e6 + ;
int k, n;
struct node{
int type, x, cnt = ;
}ball[maxn], que[maxn];
int cnt[]; 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++){
cnt[i] = ;
int t;
scanf("%d", &t);
for(int j = ; j < t; j++){
scanf("%d", &ball[tot].x);
ball[tot].type = i;
tot++;
}
}
sort(ball, ball + tot, cmp); int tail = , head = ;
int ans = INT_MAX, type_cnt = ;
for(int i = ; i < tot; i++){
que[++tail] = ball[i];
cnt[ball[i].type]++;
if(cnt[ball[i].type] == )type_cnt++;
while(type_cnt == k){
ans = min(ans, que[tail].x - que[head].x);
cnt[que[head].type]--;
if(cnt[que[head].type] == )type_cnt--;
head++;
}
} printf("%d\n", ans);
return ;
}

最新文章

  1. [转]Android样式的开发:shape篇
  2. Arduino.h
  3. 【132】iPad使用相关问题
  4. leetcode@ [62/63] Unique Paths II
  5. Android ListView+image的使用
  6. ssh整合启动tomcat报java.lang.ClassNotFoundException: org.apache.commons.lang.xwork.StringUtils
  7. JAVA排序(一) Comparable接口
  8. POI获取Excel列数和行数的方法
  9. JS将文件以form表单一样提交到后台
  10. android之使用GridView+仿微信图片上传功能
  11. python字符串常用内置方法
  12. 【翻译】Ext JS 6早期访问版本发布
  13. Flask快速入门
  14. BZOJ_1877_[SDOI2009]晨跑_费用流
  15. [Maven]Maven构建可执行的jar包(包含依赖jar包)
  16. Jenkins|简单Job配置|启动脚本|测试报告
  17. [Swift]LeetCode581. 最短无序连续子数组 | Shortest Unsorted Continuous Subarray
  18. Qt Widgets——主窗口及其主要组成部分
  19. js高级-执行上下文
  20. 【慕课网实战】Spark Streaming实时流处理项目实战笔记三之铭文升级版

热门文章

  1. c#中如何退出程序后自动重新启动程序
  2. Dubbo -- 系统学习 笔记 -- API参考手册
  3. Jquery Ajax 和json用法
  4. Spring4 Quartz2 动态任务,Spring4整合quartz2.2.3简单动态任务
  5. centos7安装python-3.5
  6. Nginx(五)-- 配置文件之Rewrite
  7. React Native 开发工具篇
  8. sklearn提供的自带的数据集
  9. 【Linux】Could not resolve: www.test.com (Could not contact DNS servers)
  10. 【CSS系列】网页头部进度条方式一