首页 > 其他分享 >P4032 [Code+#2] 火锅盛宴

P4032 [Code+#2] 火锅盛宴

时间:2023-10-04 18:35:21浏览次数:40  
标签:+# P4032 Code ll cnt else ch id pot

prologue

树状数组推荐写法,感谢巨佬樱雪喵的教学。


inline int lowbit(int x)
{
	return x & -x;
}

inline void add(int x, int c)
{
	for(; x <= n; x += lowbit(x)) tr[x] += c;
}

inline int sum(int x)
{
	int res = 0;
	for(; x; x -= lowbit(x)) res += tr[x];
	return res;
}

analysis

很弱的模拟题?

这个题目主要解决的问题就以下几个:

  1. 对于 YJQQQAQ 怎么快速的查询和删除它要吃掉的东西。
  2. 怎么维护东西熟了没熟(不干不净吃了没病?)
  3. 维护一个区间里面的和。

我们可以想到,关于时间类型的问题,它必定是顺着时间进行的(废话但是有用),不太可能出现时间倒流(某些图论题存下来离线,倒序处理除外)。那么我们就可以用时间这一维度来搞个优先队列,然后对于每一个新输入的时间,就来处理这个锅里面的东西是不是已经做好了。

我们又注意到,Yazid 这个人很喜欢吃编号小的食物,所以我们就可以选择用另外一个优先队列来存储这些已经做好的食物。

我们还要处理怎么解决 YJQQQAQ 的问题。我们可以给每种食物开一个结构体,里面存一个队列和一个 cnt。队列用来存还没有煮熟的吃的, cnt 用来存现在做好的还没有被吃了的食物有多少。

对于一个区间的和我们可以采用线段树或者树状数组。因为树状数组的时间、空间都要优于线段树。所以我就用树状数组实现了(主要是懒的敲线段树了。

剩下的就貌似是一个比较大的模拟题了。(

code time

(之前调上面树状数组那一块一直没调出来,然后压了点行。)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
#define wl putchar('\n')
#define ws putchar(' ')

template <class T>

inline void read(T &res)
{
    char ch; bool f = 0;
    while((ch = getchar()) < '0' || ch > '9') f |= ch == '-';
    res = ch ^ 48;
    while((ch = getchar()) <= '9' && ch >= '0') res = (res << 1) + (res << 3) + (ch ^ 48);
    res = f ? ~res + 1 : res;
}

inline void ww(ll x)
{
    if(x < 0) x = ~x + 1, putchar('-');
    if(x > 9) ww(x / 10);
    putchar(x % 10 ^ 48);
}


const ll N = 1e5 + 10;

ll n, m, eat[N], s[N], tr[N];

struct node
{
    ll id, time;
    bool operator <(const node &x) const 
    {
        return time > x.time;
    }
};

struct pot
{
    ll cnt;
    queue<ll> T;
    inline void clean()
    {
        cnt = 0;
        while(T.size()) T.pop();
    }
}pot[N];

priority_queue<node> q;
priority_queue<ll> ripe;

inline ll lowbit(ll x)
{
    return x & -x;
}

inline void add(ll x, ll c)
{
    for(; x <= n; x += lowbit(x)) tr[x] += c;
}

inline ll sum(ll x)
{
    ll res = 0;
    for(; x; x -= lowbit(x)) res += tr[x];
    return res;
}

int main()
{
    // freopen("1.in", "r", stdin), freopen("1.out", "w", stdout);

    ll T; read(T);
    while(T -- )
    {
        read(n);
        while(q.size()) q.pop(); while(ripe.size()) ripe.pop(); 
        for(rl i=1; i <= n; ++ i)
        {
            read(s[i]);
            eat[i] = 0;
            pot[i].clean();
            tr[i] = 0;
        }
        
        read(m);
        while(m -- )
        {
            ll t, op, a, b;
            read(t), read(op);

            while(q.size() && q.top().time <= t)
            {
                ll id = q.top().id;
                add(id, 1);

                pot[id].cnt ++ ; pot[id].T.pop();
                ripe.push(-id);

                q.pop();
            }

            if(op == 0) { read(a), q.push({a, t + s[a]}), pot[a].T.push(t + s[a]); }
            else if(op == 1)
            {   
                ll id = -1;
                while(ripe.size())
                {
                    ll x = -ripe.top();
                    ripe.pop();
                    if(eat[x] > 0) -- eat[x];
                    else 
                    {
                        id = x;
                        break; 
                    }
                }

                if(id == -1) puts("Yazid is angry.");
                else ww(id), add(id, -1), -- pot[id].cnt, wl;
            }
            else if(op == 2)
            {
                read(a);
                if(pot[a].cnt)
                {
                    -- pot[a].cnt; add(a, -1); ++ eat[a];
                    puts("Succeeded!");
                }
                else 
                {
                    if(pot[a].T.size()) ww(pot[a].T.front() - t), wl;
                    else puts("YJQQQAQ is angry.");
                }
            }
            else 
            {
                read(a), read(b);
                ww(sum(b) - sum(a - 1)), wl;
            }
        }
    }
    return 0;
}

标签:+#,P4032,Code,ll,cnt,else,ch,id,pot
From: https://www.cnblogs.com/carp-oier/p/17742548.html

相关文章

  • springboot+Uniapp+redis开发的AI医疗智能导诊系统源码
    AI+医疗的智能导诊系统源码 自主版权 支持二开一、什么是智能导诊系统?智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件,它能够通过对患者的症状、病史等信息进行计算分析,快速推荐科室和医生。通过简单的描述自身症状,系统即可找到最适合的科室,实现线上高效挂号,线下......
  • LeetCode 88 合并两个有序数组
    LeetCode88合并两个有序数组1.题目地址https://leetcode.cn/problems/merge-sorted-array/description/?envType=study-plan-v2&envId=top-interview-1502.题解这道题跟归并排序的归并操作非常类似。(具体内容可以查看我的博客,这里不再赘述。)但是有一个需要注意......
  • 探索化学之秘:PerkinElmer ChemDraw Pro 2022 - 分子结构的视觉盛宴 mac+win版
    PerkinElmerChemDrawPro2022是一款全球领先的化学绘图软件,为全球科研人员、教育工作者以及工业界专业人士提供了直观、高效的工具,以创建、呈现和探索分子结构与化学反应。→→↓↓载PerkinElmerChemDrawPro2022mac/win版一、直观的绘图界面,快速构建分子模型PerkinElmer......
  • 十四天学会C++之第三天(数组和字符串)
    1.数组的定义和初始化数组是一种由相同数据类型的元素组成的集合,这些元素按照一定的顺序存储在连续的内存位置上。数组的大小在创建时是固定的,无法在运行时改变。在C++中,数组的定义和声明非常简单。定义一个数组:数据类型数组名[数组大小];数据类型可以是整数、浮点数、字符等,数组......
  • MySQL学习(3)B+树索引是如何快速查询的
    前言我们已经知道在磁盘中,有很多索引页,这些页并非在物理结构上相连接,而是通过双向链表关联。如果要查找一条数据,需要通过页目录中的槽,通过二分法定位到分组再进行遍历查找。比如下面这样:SELECT[查询列表]FROM表名WHERE条件; 假设表中只有一个页,在查找记录时,可以根据搜......
  • C++ Thread 条件变量
    Condition_Variable介绍条件变量是利用线程间共享的全局变量进行同步的一种机制条件变量是为了控制多线程有顺序地访问共享资源,它和互斥量协同控制多线程有序,互斥地访问共享资源,重要解决的问题是生产者和消费者的问题variable_condition该类是专门结合unique_lock使用......
  • CodeForces 1864H Asterism Stream
    洛谷传送门CF传送门好题。考虑计算\(x\)落在\([1,n-1]\)的概率。设\(f_i\)为\(x\)经过\(i\)的概率,答案即为\(\sum\limits_{i=1}^{n-1}f_i\)。\(f\)有一个朴素的递推:\[f_i=\begin{cases}\frac{1}{2}(f_{i-1}+f_{\frac{i}{2}})&2\midi\\\fr......
  • 各省数字专利申请数据计算(acl+permission功能的使用)
    需求:工作中需要计算各省数字专利申请数据,需要首先利用sql的acl参数对数据库的数据框进行预处理,然后通过permission参数进行转换后计算处理,最后利用分类分析法来进行单项计算和归类存储,用于后续的深度数据挖掘。解决:sql:DROPTABLEIFEXISTSacl;CREATETABLEacl(idintNOTN......
  • VC++ MFC 编程--CMap的使用
    本文翻译自: CMapHow-to-CodeProject介绍像我这样的程序员,在CMap之前学习了STL::map,总是认为CMap很难使用,并且总是尝试以STL::map的方式使用CMap。在本文中,我将解释CMap,以及如何将它用于您自己的自定义类。在本文的最后,我将展示一个如何正确使用CMap与CString*的例子(注意,我......
  • 连接SQL Server数据库(详细步骤+登录注册案例)
    数据库入门~连接数据库(详细步骤+登录注册案例+简单界面)步骤一:SQLServer使用sqlserver身份验证登录,方便与编写的程序连接 <1>首先使用Windows登录进去,右键实例,点击属性,再选择安全性,将该选项卡中的服务器身份验证改为sqlserver和windows身份验证模式。点击确定 <2>此时重......