首先我们可以将这道题看成一个数轴,数轴其中的某些点存在一些颜色,我们要选取最短的一段,使这段存

在所有颜色,那么我们使用指针i,j表示在j-i位置中包含的颜色,那么初值是0,0,我们先i++,同时添加i位置

的颜色,直到j-i中存在所有颜色,然后j++,同时删除颜色,直到不存在所有颜色,然后更新答案,重复这过程,

因为i,j只增不减,所以是o(n)的,但是要离散化,还是nlogn的,也算是贪心吧

/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/ //By BLADEVIL
var
n, k :longint;
a, c, size :array[..] of longint;
flag :array[..] of longint;
tot :longint;
l :longint;
pre, other :array[..] of longint;
last :array[..] of longint; function min(a,b:longint):longint;
begin
if a>b then min:=b else min:=a;
end; procedure swap(var a,b:longint);
var
c :longint;
begin
c:=a; a:=b; b:=c;
end; procedure connect(x,y:longint);
begin
inc(l);
pre[l]:=last[x];
last[x]:=l;
other[l]:=y;
end; procedure qs(low,high:longint);
var
i, j :longint;
xx :longint;
begin
i:=low; j:=high; xx:=a[(i+j) div ];
while i<j do
begin
while a[i]<xx do inc(i);
while a[j]>xx do dec(j);
if i<=j then
begin
swap(a[i],a[j]);
swap(c[i],c[j]);
inc(i); dec(j);
end;
end;
if i<high then qs(i,high);
if j>low then qs(low,j);
end; procedure init;
var
i, j :longint;
x, y :longint; begin
read(n,k);
for i:= to k do
begin
read(x);
for j:= to x do
begin
read(y);
inc(tot);
a[tot]:=y;
c[tot]:=i;
end;
end;
qs(,tot);
end; procedure main;
var
i, j :longint;
cur :longint;
ans, sum :longint;
q, p :longint; begin
tot:=;
cur:=-;
for i:= to n do
begin
if a[i]<>cur then
begin
inc(tot);
size[tot]:=a[i];
cur:=a[i];
connect(tot,c[i]);
end else
begin
connect(tot,c[i]);
end;
end;
ans:=maxlongint;
i:=; j:=; sum:=;
fillchar(flag,sizeof(flag),);
while i<tot do
begin
while sum<k do
begin
inc(i);
q:=last[i];
while q<> do
begin
p:=other[q];
if flag[p]= then
begin
flag[p]:=;
inc(sum);
end else inc(flag[p]);
q:=pre[q];
end;
if i>tot then break;
end;
if i>tot then break;
while sum>=k do
begin
inc(j);
q:=last[j];
while q<> do
begin
p:=other[q];
dec(flag[p]);
if flag[p]= then dec(sum);
q:=pre[q];
end;
if j>tot then break;
end;
ans:=min(ans,size[i]-size[j]);
end;
writeln(ans);
end; begin
init;
main;
end.

bzoj 1293 贪心的更多相关文章

  1. [BZOJ 1293] 生日礼物

    Link: BZOJ 1293 传送门 Solution: 这题直接上尺取法就行了吧 先将每种颜色第一个放入优先队列,用$mx$维护当前的末尾位置 每次取出第一个颜色,更新答案.将其下一个放入队列中去 ...

  2. bzoj 1193 贪心

    如果两点的曼哈顿距离在一定范围内时我们直接暴力搜索就可以得到答案,那么开始贪心的跳,判断两点横纵坐标的差值,差值大的方向条2,小的条1,不断做,直到曼哈顿距离较小时可以暴力求解. 备注:开始想的是确定 ...

  3. bzoj 2697 贪心

    就贪心就行了,首先可以看成n个格子,放物品,那么 一个物品假设放3个,放在1,k,n处,那么价值和放在1,n 是一样的,所以一个物品只放两个就行了,价值大的应该尽量放 在两边,那么排序之后模拟就行了 ...

  4. bzoj 3037 贪心

    我们可以贪心的分析,每个点的入度如果是0,那么这个点不可能 被用来更新答案,那么我们每次找入度为0的点,将他去掉,如果他连的 点没有被更新过答案,那么更新答案,去掉该点,环的时候最后处理就行了 /** ...

  5. BZOJ 1293: [SCOI2009]生日礼物【单调队列】

    1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2534  Solved: 1383[Submit][Stat ...

  6. [bzoj 1293] [SCOI2009] 生日礼物

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

  7. bzoj 1193 贪心+bfs

    1193: [HNOI2006]马步距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2015  Solved: 914[Submit][Statu ...

  8. bzoj 1899 贪心+dp

    思路:这个贪心排顺序我居然没看出来. 吃饭时间长的在前面, 用反证法很容易得出. 剩下的就是瞎dp啦. #include<bits/stdc++.h> #define LL long lo ...

  9. 【题解】期末考试 六省联考 2017 洛谷 P3745 BZOJ 4868 贪心 三分

    题目传送门:这里是萌萌哒传送门(>,<) 啊♀,据说这题有个完全贪心的做法,但是要维护太多东西好麻烦的(>,<),于是就来口胡一发三分的做法. 思路很简单,假设我指定了一个x, ...

随机推荐

  1. Java Set集合(HashSet、TreeSet)

    什么是HashSet?操作过程是怎么样的? 1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构 2.哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素 ...

  2. [译]如何去除Git的unstaged的文件提示“old mode 100755 new mode 100644”?

    原文来源:https://stackoverflow.com/questions/1257592/how-do-i-remove-files-saying-old-mode-100755-new-mo ...

  3. UVA 437 The Tower of Babylon(DAG上的动态规划)

    题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...

  4. [android]不解锁刷机

    本人因为误操作进入andriod recovery模式,显示failed to boot 2,致手机无法恢复出厂值, 当时那叫一个郁闷.上论坛搜寻无数,唉让刷底包的无数(在此不解释),万恶的刷底包. ...

  5. 指针C语言

    一.PTA实验作业 题目一:6-7输出月份英文名 1.PTA提交列表 2.设计思路和流程图 这题只需补充子函数,定义指针数组month[12],分别从一月到十二月,再定义一个字符,让它为NULL,当输 ...

  6. linux基本操作2

    将当前用户目录下的文件清单输出到文件list1.txt(当前用户目录下)中ls -l > list1.txt 利用管道命令将根(/)下所有修改日期在4月16日的文件清单输出到list2.txt( ...

  7. PAT 1030 完美数列

    https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224 给定一个正整数数列,和正整数 p,设这个数列 ...

  8. 《深入浅出 Java Concurrency》—并发容器 ConcurrentMap

    (转自:http://blog.csdn.net/fg2006/article/details/6404226) 在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器 ...

  9. float与定位的区别

    float和绝对定位的区别 CSS中脱离文档流,也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位.1 需要注意的是,使用float脱离文档流时,其他盒子 ...

  10. mii-tool与ethtool的用法详解

    mii-tool与ethtool的用法详解 1.mii-tool 配置网络设备协商方式的工具: 感谢原文作者!原文地址:http://blog.chinaunix.net/uid-20639775-i ...