题目描述

Jasio 是一个三岁的小男孩,他最喜欢玩玩具了,他有n 个不同的玩具,它们都被放在了很高的架子上所以Jasio 拿不到它们. 为了让他的房间有足够的空间,在任何时刻地板上都不会有超过k 个玩具. Jasio 在地板上玩玩具. Jasio'的妈妈则在房间里陪他的儿子. 当Jasio 想玩地板上的其他玩具时,他会自己去拿,如果他想玩的玩具在架子上,他的妈妈则会帮他去拿,当她拿玩具的时候,顺便也会将一个地板上的玩具放上架子使得地板上有足够的空间. 他的妈妈很清楚自己的孩子所以他能够预料到Jasio 想玩些什么玩具. 所以她想尽量的使自己去架子上拿玩具的次数尽量的少,应该怎么安排放玩具的顺序呢?

输入输出格式

输入格式:

第一 行三 个整数:n,k,p(1≤k≤n≤100,000,1≤p≤500000), 分别表示玩具的总数,地板上玩具的最多个数以及 JasioJasio 他想玩玩具的序列的个数,接下来 pp 行每行描述一个玩具编号表示 Jasio 想玩的玩具。

输出格式:

一个数表示 JasioJasio 的妈妈最少要拿多少次玩具。

输入输出样例

输入样例#1:

3 2 7
1
2
3
1
3
1
2

输出样例#1:

4

思路

luogu一直AC不了的小朋友们看这里:

不要提交SP688,提交P3419 [POI2005]SAM-Toy Cars

不要提交SP688,提交P3419 [POI2005]SAM-Toy Cars

不要提交SP688,提交P3419 [POI2005]SAM-Toy Cars

至于为什么,我也不知道。。。反正本人卡了3次提交在luogu上(手动滑稽)

这道题使用贪心+堆优化。

贪心为:

每一次输入一个数将弹出一个大小为k的集合中的一个数才能使该数加入。

当然,如果该数早就在集合当中就可以直接切换到下一个数。

前k个数也可以直接进入集合中。

问题来了?到底弹集合中的哪一个数才能最优呢?

当然是下一次出现的距离最远的那一个数了。

堆优化:

priority_queue<int> q;

就是一个大根堆。

那么这道题需要将堆里的类型修改一下。

priority_queue<pair<int,int> >q;

pair的前一个储存节点的下一次出现位置,第二个储存该节点的值。

这样就可以自动的排序出距离最远的那一个数了。

所以每次操作只需要将q.top()取出,然后将头元素删除——q.pop()。

最后,上代码:

#include<algorithm>
#include<bitset>
#include<complex>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<locale>
#include<map>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<typeinfo>
#include<utility>
#include<valarray>
#include<vector>
#include<cstring>
#include<cmath>
#define ll long long
#define FHAKIOI int
using namespace std;//头文件结束
inline ll read(){
ll ret=,f=;char ch=getchar();
while (ch<''||ch>'') {if (ch=='-') f=-f;ch=getchar();}
while (ch>=''&&ch<='') ret=ret*+ch-'',ch=getchar();
return ret*f;
}//读优结束
inline void write(ll zx){
if(zx<){zx=-zx;putchar('-');}
if(zx<) putchar(zx+'');
else{
write(zx/);
putchar(zx%+'');
}
}//输优结束
ll n,k,p,a[];
ll use[];
ll f[];
ll las[],ans;
ll nxt[];
priority_queue<pair<int,int> > q;//堆
FHAKIOI main(){
n=read();k=read();p=read();
for(ll i=;i<=p;i++) a[i]=read(),las[a[i]]=p+;//读入
for(ll i=p;i>=;i--){
nxt[i]=las[a[i]];
las[a[i]]=i;
}//先预处理与下一次出现的位置的距离
for(int i=;i<=p;i++){
if(use[a[i]]!=){
q.push(make_pair(nxt[i],a[i]));//已经在集合里了
}else if(k!=){//前K个数
k--;
ans++;
use[a[i]]=;
q.push(make_pair(nxt[i],a[i]));
}else{//最后一种情况,需要弹出一个数
while(!use[q.top().second]) q.pop();//目前没有在集合中
int x=q.top().second;//取距离最远的
q.pop();
use[x]=;
ans++;//ans加一
use[a[i]]=;
q.push(make_pair(nxt[i],a[i]));
}
}
write(ans);putchar('\n');/输出
return ;
}

SAM-Toy Cars题解的更多相关文章

  1. P3419 [POI2005]SAM-Toy Cars / SP688 SAM - Toy Cars

    一道很妙的贪心题 题面 我们考虑当我们插入时会面临的两种情况 当地上的玩具,不满 \(k\) 个时,那我们直接放就可以了. 当满了 \(k\) 个的时候,我们就要从地上拿出一个来给当前的腾位置. 这就 ...

  2. Codeforces Round #303 (Div. 2) A. Toy Cars 水题

     A. Toy Cars Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/545/problem ...

  3. 周赛-Toy Cars 分类: 比赛 2015-08-08 15:41 5人阅读 评论(0) 收藏

    Toy Cars time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  4. A - Toy Cars

    Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Description Little ...

  5. 水题 Codeforces Round #303 (Div. 2) A. Toy Cars

    题目传送门 /* 题意:5种情况对应对应第i或j辆车翻了没 水题:其实就看对角线的上半边就可以了,vis判断,可惜WA了一次 3: if both cars turned over during th ...

  6. 题解 CF545A 【Toy Cars】

    题目传送门 太弱了,只能写写A题的题解 题意 给你一个 $n·n$ 的矩阵,翻车分三种情况: 如果 $a_i,_j=1$ ,记录第 $i$ 辆车 如果 $a_i,_j=2$ ,记录第 $j$ 辆车 如 ...

  7. Bzoj 1229: [USACO2008 Nov]toy 玩具 题解 三分+贪心

    1229: [USACO2008 Nov]toy 玩具 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 338  Solved: 136[Submit] ...

  8. [POI2005]Toy Cars

    题目大意: 有n种物品,地上有k个格子,p次操作. 每次操作要求将某一个指定的物品移动到任意一个格子中,同时你可以选择是否将格子中的某一个物品收起来,并消耗1的代价. 如果下达指令时,这个物品刚好在格 ...

  9. CF605A Sorting Railway Cars 题解

    To CF 这道题依题意可得最终答案为序列长度-最长子序列长度. 数据范围至 \(100000\) 用 \(O(n^2)\) 的复杂度肯定会炸. 用 \(O(nlogn)\) 的复杂度却在第 \(21 ...

随机推荐

  1. cmakelist 定义字符串,替换到脚本中。

    cmake_minimum_required(VERSION 2.6 FATAL_ERROR) cmake_policy(VERSION 2.6) # . Project Name project(s ...

  2. C++之面向对象编程20170912

    /*************************************************************************************************** ...

  3. HDU 4584 splay

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  4. 相同内容 yaml 与 json 格式对比

    关联数组: yaml person: name: 张三 age: 24 json { "person": { "name": "张三", . ...

  5. jsp 的 4 种基本语法

    1.JSP 注释 2.JSP 声明 3.JSP 表达式 4.JSP 脚本 JSP 注释: 注释格式: <%-- 注释内容 --%> 需要注意的是,JSP 的注释不会输出到 HTML 中. ...

  6. HAOI2017游记

    HACF的最终成绩已经出炉,但是事情还没有结束. 好多想说的,不知道从何说起,就按照时间顺序说吧. 考前 考前大概一周半就开始复习了,一些比较重要的算法,比如KDT,单纯性,线性基等等没有再继续学,所 ...

  7. mysql 中delete和trncate区别

    mysql中删除表记录delete from和truncate table的用法区别: MySQL中有两种删除表中记录的方法:(1)delete from语句,(2)truncate table语句. ...

  8. linux 内存计算

    原文: http://www.open-open.com/lib/view/open1424325362577.html Linux中的Cache Memory 什么是Cache Memory(缓存内 ...

  9. 远程调试openstack

    之前一直没有找到方法调试openstack的horizon代码,现在终于找到方法了,特别感谢下面这篇博客,讲解非常清晰: http://blog.csdn.net/tantexian/article/ ...

  10. [DeeplearningAI笔记]卷积神经网络2.2经典网络

    4.2深度卷积网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 [LeNet]--Lécun Y, Bottou L, Bengio Y, et al. Gradient-bas ...