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. 移动web开发填坑(一)

    上周开始接触移动web开发,默默的掉进了很多坑里面.本文主要总结本周遇到的坑以及如何填坑. 1.px与rem换算. 设计稿的宽度一般是640px,而iphone是320px,所以测量设计稿的结果首先要 ...

  2. SQL Case 语句的使用

    -----简单case 使用 select 学号,姓名, case 专业 when '金融系' then '1' when '材料成型及控制工程' then '2' else '3' end from ...

  3. SQL——视图、事务、锁、存储过程

    https://www.bilibili.com/video/av15496406/?p=57 https://blog.csdn.net/u013630349/article/details/750 ...

  4. IE主页被恶意修改处理办法

    HKEY_USERS/.DEFAULT/Software/Policies/Microsoft/Internet Explorer/Control Panel 下的DWORD值“homepage”的键 ...

  5. (转)淘淘商城系列——SSM框架整合之Dao层整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72721093 一个项目中往往有三层即Dao层.Service层和Web层,看标题就知道了,本文 ...

  6. spring cloud 概念

    微服务构架需要使用场景: 1.可以将一个系统拆分成几个系统. 2.每个子系统可以部署多个应用,多个应用之间可以使用负载均衡. 3.需要一个服务注册中心,所有的服务都在一个注册中心注册,负载均衡也是通过 ...

  7. 数组,寻找第K大的数

    时间复杂度 O(n) def partition(data,left,right): if (len(data)<=0 or left<0 or right>=len(data)): ...

  8. CAD参数绘制填充(网页版)

    填充是CAD图纸中不可或缺的对象,在机械设计行业,常常需要将零部件剖开,以表现其内部的细节,而这些被剖开的截面会用填充来表示:在工程设计行业,一些特殊的材料或地形,也会用填充来表示. js中实现代码说 ...

  9. 扩展 IHttpModule

    上篇提到请求进入到System.Web后,创建完HttpApplication对象后会执行一堆的管道事件,然后可以通过HttpModule来对其进行扩展,那么这篇文章就来介绍下如何定义我们自己的mod ...

  10. 最小生成树Prim算法 Kruskal算法

    Prim算法(贪心策略)N^2 选定图中任意定点v0,从v0开始生成最小生成树 树中节点Va,树外节点Vb 最开始选一个点为Va,其余Vb, 之后不断加Vb到Va最短距离的点 1.初始化d[v0]=0 ...