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

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

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

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

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
//#include<queue>
//#include<math.h>
//#include<time.h>
//#include<iostream>
using namespace std; int T,n,m;
#define maxn 200011
#define maxq 500011 struct SMT
{
struct Node
{
int sum;
int ls,rs;
}a[maxn<<];
int size;
void build(int &x,int L,int R)
{
x=++size; a[x].sum=;
if (L==R) {a[x].ls=a[x].rs=; return;}
const int mid=(L+R)>>;
build(a[x].ls,L,mid); build(a[x].rs,mid+,R);
}
void build() {size=; int x; build(x,,n);}
void up(int x) {a[x].sum=a[a[x].ls].sum+a[a[x].rs].sum;}
int ql,qr,v;
bool Add(int x,int L,int R)
{
if (L==R)
{
if (v==- && a[x].sum==) return ;
a[x].sum+=v; return ;
}
else
{
const int mid=(L+R)>>;bool ans;
if (ql<=mid) ans=Add(a[x].ls,L,mid);
else ans=Add(a[x].rs,mid+,R);
up(x); return ans;
}
}
bool add(int x,int v) {ql=x; this->v=v; return Add(,,n);}
int Find(int x,int L,int R)
{
if (L==R) return L;
const int mid=(L+R)>>;
if (a[a[x].ls].sum>) return Find(a[x].ls,L,mid);
return Find(a[x].rs,mid+,R);
}
int find() {return Find(,,n);}
int Query(int x,int L,int R)
{
if (ql<=L && R<=qr) return a[x].sum;
int mid=(L+R)>>,ans=;
if (ql<=mid) ans+=Query(a[x].ls,L,mid);
if (qr> mid) ans+=Query(a[x].rs,mid+,R);
return ans;
}
int query(int L,int R) {ql=L; qr=R; return Query(,,n);}
}smt; struct qnode
{
int v,id;
bool operator > (const qnode &b) const {return v>b.v;}
};
priority_queue<qnode,vector<qnode>,greater<qnode> > qtot;
queue<int> q[maxn]; int a[maxn];
int qread()
{
char c;int s=; while (!((c=getchar())>='' && c<=''));
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s;
}
void write(int x)
{
if (!x) {putchar('');putchar('\n');return;}
char buf[]; int lb=;
while (x) {buf[++lb]=x%; x/=;}
for (;lb;lb--) putchar(buf[lb]+''); putchar('\n');
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
for (int i=;i<=n;i++) a[i]=qread();
for (int i=;i<=n;i++) while (!q[i].empty()) q[i].pop();
while (!qtot.empty()) qtot.pop();
smt.build();
scanf("%d",&m);
int t,op,id,x,y;
while (m--)
{
t=qread(),op=qread();
while (!qtot.empty() && qtot.top().v<=t) smt.add(qtot.top().id,),q[qtot.top().id].pop(),qtot.pop();
if (op==)
{
id=qread();
q[id].push(t);
qtot.push((qnode){t+a[id],id});
}
else if (op==)
{
if (smt.a[].sum==) puts("Yazid is angry.");
else
{
int ans=smt.find();
write(ans);
smt.add(ans,-);
}
}
else if (op==)
{
id=qread();
if (smt.add(id,-)) puts("Succeeded!");
else if (q[id].empty()) puts("YJQQQAQ is angry.");
else write(q[id].front()+a[id]-t);
}
else
{
x=qread(),y=qread();
write(smt.query(x,y));
}
}
}
return ;
}

「CodePlus 2017 12 月赛」火锅盛宴的更多相关文章

  1. 「CodePlus 2017 12 月赛」火锅盛宴(模拟+树状数组)

    1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟 ...

  2. [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞

    [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...

  3. 「CodePlus 2017 12 月赛」可做题2(矩阵快速幂+exgcd+二分)

    昨天这题死活调不出来结果是一个地方没取模,凉凉. 首先有个一眼就能看出来的规律... 斐波那契数列满足$a_1, a_2, a_1+a_2, a_1+2a_2, 2a_1+3a_2, 3a_1+5a_ ...

  4. 【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞

    [题目]给定n行m列的矩阵,每个位置有一个指示方向(上下左右)或没有指示方向(任意选择),要求给未定格(没有指示方向的位置)确定方向,使得从任意一个开始走都可以都出矩阵,求方案数.n,m<=20 ...

  5. 【LIbreOJ】#6256. 「CodePlus 2017 12 月赛」可做题1

    [题意]定义一个n阶正方形矩阵为“巧妙的”当且仅当:任意选择其中n个不同行列的数字之和相同. 给定n*m的矩阵,T次询问以(x,y)为左上角的k阶矩阵是否巧妙.n,m<=500,T<=10 ...

  6. 【LibreOJ】#6257. 「CodePlus 2017 12 月赛」可做题2

    [题意]数列满足an=an-1+an-2,n>=3.现在a1=i,a2=[l,r],要求满足ak%p=m的整数a2有多少个.10^18. [算法]数论(扩欧)+矩阵快速幂 [题解]定义fib(i ...

  7. 「CodePlus 2017 12 月赛」白金元首与独舞

    description 题面 data range \[ 1 \leq T \leq 10, 1 \leq n, m \leq 200 , 0 \leq k \leq \min(nm, 300)\] ...

  8. 走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞

    n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未 ...

  9. loj6259「CodePlus 2017 12 月赛」白金元首与独舞

    分析 我们将没连的点连向周围四个点 其余的按照给定的方向连 我们将所有连出去的位置统一连到0点上 再以0作为树根 于是就将问题转化为了有向图内向树计数 代码 #include<iostream& ...

随机推荐

  1. hihocoder offer收割编程练习赛11 C 岛屿3

    思路: 并查集的应用. 实现: #include <iostream> #include <cstdio> using namespace std; ][]; int n, x ...

  2. 如需在APP中使用腾讯QQ登陆,需提前申请获取腾讯QQ的APPKEY和APPSecret。

    如需在APP中使用腾讯QQ登陆,需提前申请获取腾讯QQ的APPKEY和APPSecret. 申请流程如下: 步骤1:登陆腾讯开放平台.链接地址: http://open.qq.com/ . 步骤2:填 ...

  3. idea 2018 解决 双击shift 弹出 search everywhere 搜索框的方法

    https://youtrack.jetbrains.com/issue/IDEA-161094

  4. darknet+opencv在windows上的编译

    darknet 源码网站:https://github.com/pjreddie/darknet 技术支持官网:https://pjreddie.com/darknet/ darknet采用C++编写 ...

  5. log级别

    trace<debug<info<warn<error<fatal trace: 是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没 ...

  6. OC语言Block 续

    OC语言 Block 转载:http://blog.csdn.net/weidfyr/article/details/48138167 1.Block对象中的变量行为 结论: 在block代码块内部可 ...

  7. 黑马程序员----java基础:String与StringBuffer及基本数据类型包装类

    ------- android培训.java培训.期待与您交流! ---------- java中一些基础类比如String.StringBuffer和基本数据类型包装类都是非常常见且使用非常频繁的类 ...

  8. 总结几点sql语句优化

    一.表设计阶段: 1.主键的使用    a.业务日志表.安全审计表采用自增长:    b.自定义编号用于业务流程类表,根据一定的编号规则:    c.int型主键 用于基础数据表: 2.逻辑删除字段的 ...

  9. 关于SQL Server数据表的五种约束

    1.主键约束(PRIMARY KEY) 主键约束可以在表中定义一个主键值,它可以唯一确定表中每一条记录,每个表中只能有一个主键约束(只能有一个主键约束的意思并不是说受主键约束的列只能有一个),并且受主 ...

  10. python3爬取微博评论并存为xlsx

    python3爬取微博评论并存为xlsx**由于微博电脑端的网页版页面比较复杂,我们可以访问手机端的微博网站,网址为:https://m.weibo.cn/一.访问微博网站,找到热门推荐链接我们打开微 ...