LUOGU P2564 [SCOI2009]生日礼物 (队列+模拟)

传送门

解题思路

  还是比较好想的,用一个队列,然后把所有点放在一起排个序,依次入队。每次检查队头元素的种类是否为当前入队元素种类,是的话就一直\(pop\),每次更新答案即可。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>

using namespace std;
const int MAXN = 1000005;

inline int rd(){
    int x=0;char ch=getchar();
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
    return x;
}

int n,k,ans=1e9,cnt,num;
int vis[MAXN];
struct Data{
    int col,t;
    friend bool operator<(const Data A,const Data B){
        return A.t<B.t;
    }
}data[MAXN],tmp;

queue<int> Q;

int main(){
    n=rd();k=rd();int x;
    for(int i=1;i<=k;i++){
        x=rd();tmp.col=i;
        while(x--) {tmp.t=rd();data[++cnt]=tmp;}
    }
    sort(data+1,data+1+cnt);
    for(int i=1;i<=cnt;i++){
        Q.push(i);
        if(!vis[data[i].col]) num++;vis[data[i].col]=i;
        while(Q.size()){
            x=Q.front();if(vis[data[x].col]!=x) Q.pop();
            else break;
        }
        if(num==k) ans=min(ans,data[i].t-data[x].t);
    }cout<<ans;
    return 0;
}

原文地址:https://www.cnblogs.com/sdfzsyq/p/9811797.html

时间: 2024-10-11 08:10:36

LUOGU P2564 [SCOI2009]生日礼物 (队列+模拟)的相关文章

P2564 [SCOI2009]生日礼物?

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

BZOJ 1293: [SCOI2009]生日礼物 贪心

1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2513  Solved: 1370[Submit][Status][Discuss] Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上. 小布生日快到了,于是小西打算剪一段彩带送给小

用两个队列模拟实现一个栈的过程

栈具有"后进先出"的特点,即某个元素最后进入栈,却最先出栈:队列具有"先进先出"的特点,即元素从队尾依次进队列,依次从队头出队列:现在用两个队列模拟实现一个栈的过程,详细过程请看下面这张本人制作的gif图: 实现代码: #include <iostream> using namespace std; #include <queue> template <typename T> class Stack { public: void

1293: [SCOI2009]生日礼物

1293: [SCOI2009]生日礼物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1096  Solved: 584[Submit][Status] Description 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上. 小布生日快到了,于是小西打算剪一段彩带送给小布.为了让礼物彩带足

Codeforces 704A Thor 队列模拟

题目大意:托尔有一部手机可执行三种操作 1.x APP产生一个新消息 2.读取x App已产生的所有消息 3.读取前t个产生的消息 问每次操作后未读取的消息的数量 题目思路: 队列模拟,坑点在于竟然卡内存……详细看代码. #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<stdio.h> #include<stdlib.h&g

火车车厢重排问题--队列模拟

①问题描述 一列货运列车共有n节车厢,每节车厢将停放在不同的车站.假定n个车站的编号分别为1-n,即货运列车按照第n站至第1站的次序经过这些车站.为了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编号相同,这样,在每个车站只要卸掉最后一节车厢.所以,给定任意次序的车厢,必须重新排列它们. 车厢的重排工作可以通过转轨站完成.在转轨站中有一个入轨.一个出轨和k个缓冲轨,缓冲轨位于入轨和出轨之间.假定缓冲轨按先进先出的方式运作,设计算法解决火车车厢重排问题. ②基本要求 设计存储结构表示n个车厢.k

用队列模拟基数排序

function Queue() { //用队列模拟基数排序对应的Queue构造函数中的方法一个都不能少,否则会出错 this.dataStore = []; this.enqueue = enqueue; this.dequeue = dequeue; this.empty = empty; } function enqueue(element) {//向队尾添加一个元素 this.dataStore.push(element); } function dequeue() {//删除队首的元素

栈模拟队列 队列模拟栈

代码如下: PS:做了一些测试,目前没问题.有问题请指正... 栈模拟队列 队列模拟栈

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege