「CodePlus 2017 12 月赛」火锅盛宴

n<=100000种食物,给每个食物煮熟时间,有q<=500000个操作:在某时刻插入某个食物;查询熟食中编号最小的并删除之;查询是否有编号为id的食物,如果有查询是否有编号为id的熟食,如果有熟食删除之,否则输出其离煮熟的最小时间;查询编号在[L,R]的熟食有多少。保证操作时间递增。

可以发现:针对某种食物的信息维护只需要知道其未煮熟的食物中煮熟时间的最小值,而所有的熟食都可以一起维护。为此可以:对每个食物开个队列存未熟食物,对所有食物开个优先队列以便及时把熟食从队列中提出来,并开个以编号为下标的“东西”来维护每个编号的数量和区间信息。

由于只需要单点修改、区间查询,可以用BIT。至于查熟食中的编号最小可以用BIT上倍增。

这里比较脑残就写了线段树。。然而被卡常卡死了。

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<algorithm>
  4 #include<stdlib.h>
  5 #include<queue>
  6 //#include<queue>
  7 //#include<math.h>
  8 //#include<time.h>
  9 //#include<iostream>
 10 using namespace std;
 11 
 12 int T,n,m;
 13 #define maxn 200011
 14 #define maxq 500011
 15 
 16 struct SMT
 17 {
 18     struct Node
 19     {
 20         int sum;
 21         int ls,rs;
 22     }a[maxn<<1];
 23     int size;
 24     void build(int &x,int L,int R)
 25     {
 26         x=++size; a[x].sum=0;
 27         if (L==R) {a[x].ls=a[x].rs=0; return;}
 28         const int mid=(L+R)>>1;
 29         build(a[x].ls,L,mid); build(a[x].rs,mid+1,R);
 30     }
 31     void build() {size=0; int x; build(x,1,n);}
 32     void up(int x) {a[x].sum=a[a[x].ls].sum+a[a[x].rs].sum;}
 33     int ql,qr,v;
 34     bool Add(int x,int L,int R)
 35     {
 36         if (L==R)
 37         {
 38             if (v==-1 && a[x].sum==0) return 0;
 39             a[x].sum+=v; return 1;
 40         }
 41         else
 42         {
 43             const int mid=(L+R)>>1;bool ans;
 44             if (ql<=mid) ans=Add(a[x].ls,L,mid);
 45             else ans=Add(a[x].rs,mid+1,R);
 46             up(x); return ans;
 47         }
 48     }
 49     bool add(int x,int v) {ql=x; this->v=v; return Add(1,1,n);}
 50     int Find(int x,int L,int R)
 51     {
 52         if (L==R) return L;
 53         const int mid=(L+R)>>1;
 54         if (a[a[x].ls].sum>0) return Find(a[x].ls,L,mid);
 55         return Find(a[x].rs,mid+1,R);
 56     }
 57     int find() {return Find(1,1,n);}
 58     int Query(int x,int L,int R)
 59     {
 60         if (ql<=L && R<=qr) return a[x].sum;
 61         int mid=(L+R)>>1,ans=0;
 62         if (ql<=mid) ans+=Query(a[x].ls,L,mid);
 63         if (qr> mid) ans+=Query(a[x].rs,mid+1,R);
 64         return ans;
 65     }
 66     int query(int L,int R) {ql=L; qr=R; return Query(1,1,n);}
 67 }smt;
 68 
 69 struct qnode
 70 {
 71     int v,id;
 72     bool operator > (const qnode &b) const {return v>b.v;}
 73 };
 74 priority_queue<qnode,vector<qnode>,greater<qnode> > qtot;
 75 queue<int> q[maxn];
 76 
 77 int a[maxn];
 78 int qread()
 79 {
 80     char c;int s=0; while (!((c=getchar())>='0' && c<='9'));
 81     do s=s*10+c-'0'; while ((c=getchar())>='0' && c<='9'); return s;
 82 }
 83 void write(int x)
 84 {
 85     if (!x) {putchar('0');putchar('\n');return;}
 86     char buf[15]; int lb=0;
 87     while (x) {buf[++lb]=x%10; x/=10;}
 88     for (;lb;lb--) putchar(buf[lb]+'0'); putchar('\n');
 89 }
 90 int main()
 91 {
 92     scanf("%d",&T);
 93 while (T--)
 94 {
 95     scanf("%d",&n);
 96     for (int i=1;i<=n;i++) a[i]=qread();
 97     for (int i=1;i<=n;i++) while (!q[i].empty()) q[i].pop();
 98     while (!qtot.empty()) qtot.pop();
 99     smt.build();
100     scanf("%d",&m);
101     int t,op,id,x,y;
102     while (m--)
103     {
104         t=qread(),op=qread();
105         while (!qtot.empty() && qtot.top().v<=t) smt.add(qtot.top().id,1),q[qtot.top().id].pop(),qtot.pop();
106         if (op==0)
107         {
108             id=qread();
109             q[id].push(t);
110             qtot.push((qnode){t+a[id],id});
111         }
112         else if (op==1)
113         {
114             if (smt.a[1].sum==0) puts("Yazid is angry.");
115             else
116             {
117                 int ans=smt.find();
118                 write(ans);
119                 smt.add(ans,-1);
120             }
121         }
122         else if (op==2)
123         {
124             id=qread();
125             if (smt.add(id,-1)) puts("Succeeded!");
126             else if (q[id].empty()) puts("YJQQQAQ is angry.");
127             else write(q[id].front()+a[id]-t);
128         }
129         else
130         {
131             x=qread(),y=qread();
132             write(smt.query(x,y));
133         }
134     }
135 }
136     return 0;
137 }
View Code

 

转载于:https://www.cnblogs.com/Blue233333/p/8107732.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390482.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5815. 扣分后的最大得分

给你一个 m x n 的整数矩阵 points &#xff08;下标从 0 开始&#xff09;。一开始你的得分为 0 &#xff0c;你想最大化从矩阵中得到的分数。 你的得分方式为&#xff1a;每一行 中选取一个格子&#xff0c;选中坐标为 (r, c) 的格子会给你的总得分 增加 points[r][c] 。 然…

您有一个上云锦囊尚未领取!

前期&#xff0c;我们通过文章《确认过眼神&#xff1f;上云之路需要遇上对的人&#xff01;》向大家详细介绍了阿里云咨询与设计场景下的五款专家服务产品&#xff0c;企业可以通过这些专家服务产品解决了上云前的痛点。那么&#xff0c;当完成上云前的可行性评估与方案设计后…

Python os.chdir() 方法

概述 os.chdir() 方法用于改变当前工作目录到指定的路径。 语法 chdir()方法语法格式如下&#xff1a; os.chdir(path) 参数 path -- 要切换到的新路径。 返回值 如果允许访问返回 True , 否则返回False。 实例 以下实例演示了 chdir() 方法的使用&#xff1a; #!/usr/bin/pyth…

More DETAILS! PBR的下一个发展在哪里?

最近几年图形学社区对PBR的关注非常高&#xff0c;也许是由于Disney以及一些游戏引擎大厂的助推&#xff0c;也许是因为它可以被轻松集成进实时渲染的游戏引擎当中&#xff0c;也许是因为许多人发现现在只需要调几个参数就能实现具有非常精细细节的表面着色了。反正现在网络上随…

sql server 2008 身份验证失败 18456

双击打开后加上 ;-m 然后以管理员方式 打开 SQLSERVER 2008 就可以已window身份登录 不过还没有完 右键 属性 》安全性 更改为 sql server 和 window身份验证模式 没有sql server登陆账号的话创建一个 然后把-m去掉就可以用帐号登录了 转载于:https://www.cnblogs.com/R…

Java逆向基础之AspectJ的获取成员变量的值

注意&#xff1a;由于JVM优化的原因&#xff0c;方法里面的局部变量是不能通过AspectJ拦截并获取其中的值的&#xff0c;但是成员变量可以在逆向中&#xff0c;我们经常要跟踪某些类的成员变量的值&#xff0c;这里以获取ZKM9中的qs类的成员变量g为例进行说明在StackOverFlow上…

Spark 键值对RDD操作

https://www.cnblogs.com/yongjian/p/6425772.html 概述 键值对RDD是Spark操作中最常用的RDD&#xff0c;它是很多程序的构成要素&#xff0c;因为他们提供了并行操作各个键或跨界点重新进行数据分组的操作接口。 创建 Spark中有许多中创建键值对RDD的方式&#xff0c;其中包括…

Python高级网络编程系列之基础篇

一、Socket简介 1、不同电脑上的进程如何通信&#xff1f; 进程间通信的首要问题是如何找到目标进程&#xff0c;也就是操作系统是如何唯一标识一个进程的&#xff01; 在一台电脑上是只通过进程号PID&#xff0c;但在网络中是行不通的&#xff0c;因为每台电脑的IP可能都是不一…

剑指 Offer 67. 把字符串转换成整数

写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为止。 当我们寻找到的第一个非空字符为正或者负号时&#xff0c…

4.RabbitMQ Linux安装

这里使用的Linux是CentOS6.2 将/etc/yum.repo.d/目录下的所有repo文件删除 先下载epel源 # wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo 修改epel-erlang.repo文件&#xff0c;如下图 添加CentOS 的下载源…

二、数据库设计与操作

一、 数据库设计仿QQ数据库一共包括5张数据表&#xff0c;每张数据表结构如下&#xff1a;1、 tb_User&#xff08;用户信息表&#xff09;这张表主要用来存储用户的好友关系与信息字段名数据类型是否Null值默认值绑定描述IDint否用户账号PwdVarchar(50)否用户密码Frie…

剑指 Offer 36. 二叉搜索树与双向链表

输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 我们希望将这个二叉搜索树转化为双向循环链表。链表…

1736. 替换隐藏数字得到的最晚时间

给你一个字符串 time &#xff0c;格式为 hh:mm&#xff08;小时&#xff1a;分钟&#xff09;&#xff0c;其中某几位数字被隐藏&#xff08;用 ? 表示&#xff09;。 有效的时间为 00:00 到 23:59 之间的所有时间&#xff0c;包括 00:00 和 23:59 。 替换 time 中隐藏的数…

十 web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令

Scrapy框架安装 1、首先&#xff0c;终端执行命令升级pip: python -m pip install --upgrade pip2、安装&#xff0c;wheel(建议网络安装) pip install wheel3、安装&#xff0c;lxml(建议下载安装)4、安装&#xff0c;Twisted(建议下载安装)5、安装&#xff0c;Scrapy(建议网络…

阿里与珠海横琴新区达成战略合作,阿里云助力打造横琴智能岛

5月17日&#xff0c;阿里巴巴集团、蚂蚁金服集团与珠海横琴新区管理委员会签署战略合作协议&#xff0c;三方将围绕云计算、政务民生服务、城市治理、电子商务等领域展开深入合作&#xff0c;推动横琴产业发展&#xff0c;共同建设新型智慧城市。 &#xff08;阿里巴巴集团、蚂…

chrome 开发工具_我最喜欢的Chrome开发工具提示和技巧

chrome 开发工具Chrome Developer Tools are a super powerful suite of tools for developing web applications. They can do so much, from very basic operations like traversing the DOM, to checking out network requests or even profiling your applications perform…

三十四 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

信号一般使用信号分发器dispatcher.connect()&#xff0c;来设置信号&#xff0c;和信号触发函数&#xff0c;当捕获到信号时执行一个函数 dispatcher.connect()信号分发器&#xff0c;第一个参数信号触发函数&#xff0c;第二个参数是触发信号&#xff0c; 以下是各种信号 sig…

敏捷管理之绩效考核方案

前段时间&#xff0c;公司签了年终奖确认。觉得公司发放年终奖完全是凭主观发放&#xff0c;没有事实依据&#xff0c;由此产生了对如何发放年终奖的一些想法。 奖金发放作为激励员工最直接的手段&#xff0c;往往也是让管理人员最难抉择的&#xff0c;而且很多公司&#xff0c…

记一个蒟蒻的绝望

感觉现在…… 怎么讲&#xff0c;心挺冷的。 今天一月五号了。距离省选&#xff0c;时间好短啊。 我还有那么多东西不懂。甚至听都没听说过。 等到真正去省选的时候&#xff0c;我可能跟现在一样&#xff0c;什么都不会。 我的名字能不能被看到都不知道。哈&#xff0c;还进队呢…

671. 二叉树中第二小的节点

给定一个非空特殊的二叉树&#xff0c;每个节点都是正数&#xff0c;并且每个节点的子节点数量只能为 2 或 0。如果一个节点有两个子节点的话&#xff0c;那么该节点的值等于两个子节点中较小的一个。 更正式地说&#xff0c;root.val min(root.left.val, root.right.val) 总…