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. jmeter(一)工具介绍(一)

    一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...

  2. 每天学点linux命令之locate 与 find 命令

    定位某个文件的位置 方法一 sudo find / -name libGLEW.so.1.13 -type f 方法二 sudo updatedb && locate libopenc ...

  3. ASP.NET MVC数据库初始化

    public class DBInitializer:DropCreateDatabaseAlways<BookDBContext> { protected override void S ...

  4. iOS Programming Auto Layout: Programmatic Constraints 自动布局:通过编程限制

    iOS Programming  Auto Layout: Programmatic Constraints  1.  However, if your views are created in co ...

  5. R Programming week 3-Debugging

    Something’s Wrong! Indications that something’s not right message: A generic notification/diagnostic ...

  6. 在 Windows Server 上搭建 *** 服务端(转载加亲测)

    转载自:https://diveng.io/build-shadowsocks-server-on-windows-server.html 下面的教程建议大家使用第一种方法安装,说是比较简单.我则使用 ...

  7. 整合Activiti Modeler到业务系统(或BPM平台)

    http://www.kafeitu.me/activiti/2013/03/10/integrate-activiti-modeler.html 1. 为什么要整合 Activiti 5.10版本把 ...

  8. A C compiler that parses this code will contain at least the following symbol table entries

    A C compiler that parses this code will contain at least the following symbol table entries Consider ...

  9. Laravel 使用中间件进行权限控制

    Laravel 使用中间件进行权限控制 飞凡的陀螺 关注 2018.01.24 17:45 字数 264 阅读 1138评论 0喜欢 1 先看 文档Laravel 中间件提供了一种方便的机制来过滤进入 ...

  10. Caffe结构

    caffe可以分为3层结构:blob,layer,net 在layer中,input data用bottom表示,output data用top表示.每一个layer定义了三种操作,setup(Lay ...