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. 阿里云OSS搭建移动应用直传服务的.Net C#示例

    OSS好几个都没有.Net示例,只有SDK 于是我就拿Java改成C#代码:使用前先去Nuget包管理器下载Aliyun.Acs.Core还有Aliyun.Acs.Sts: 在安装这个两个包的时候安装 ...

  2. bootstrap不同屏幕区分数值

    @media (min-width:1200px){ } @media (min-width:992px) and (max-width:1199px){ } @media (min-width:76 ...

  3. css3 transform + deviceorientation实现图片旋转效果

    1. 陀螺仪deviceorientation的使用,参考<关于陀螺仪deviceorientation>https://segmentfault.com/a/11900000071838 ...

  4. javascript之input获取的时间减1秒&&t时间恢复

    将输入得到的时间减少1秒:20:00:00  ———  19:59:59    方法一:普通时间转换 endDateMap(date){ var h = new Date(date).getHours ...

  5. iOS-UI控件之UITableView(二)- 自定义不等高的cell

    不等高的cell 给模型增加frame数据 所有子控件的frame cell的高度 @interface XMGStatus : NSObject /**** 文字\图片数据 ****/ // ... ...

  6. 调试SQL Server的存储过程及用户定义函数

    分类: 数据库管理 2005-06-03 13:57 9837人阅读 评论(5) 收藏 举报 sql server存储vb.net服务器sql语言 1.在查询分析器中调试 查询分析器中调试的步骤如下: ...

  7. vue ---- Object的一些常用的方法

    在对象上添加新属性的几种方法: 直接附代码: 法一:Es6扩展运算符添加属性 法二:利用语法Object.assign(target, ...sources)    target目标对象.source ...

  8. maven多模块项目,多web合并项目使用心得

    Fixflow,做中国最好的开源流程引擎!项目地址https://github.com/fixteam/fixflow 此文章适合maven初学者或想接触maven的用户,讲的只是皮毛,高手请自觉略过 ...

  9. Android(java)学习笔记202:JNI之hello.c(c代码功能实现)指针语法解析

    1. 接下来我们细讲分析一下前面一讲中,c功能实现的代码: (1)hello.c : #include <jni.h> char* getHello() { //////// return ...

  10. lua 之 and or not

    and是与运算,返回值如下 如果前者为false或者nil,则返回前者,否则后者 A and B 类似如下语句 if not A then return A else return B end 总结: ...