「CodePlus 2017 12 月赛」火锅盛宴
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 月赛」火锅盛宴的更多相关文章
- 「CodePlus 2017 12 月赛」火锅盛宴(模拟+树状数组)
1A,拿来练手的好题 用一个优先队列按煮熟时间从小到大排序,被煮熟了就弹出来. 用n个vector维护每种食物的煮熟时间,显然是有序的. 用树状数组维护每种煮熟食物的数量. 每次操作前把优先队列里煮熟 ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- 「CodePlus 2017 12 月赛」可做题2(矩阵快速幂+exgcd+二分)
昨天这题死活调不出来结果是一个地方没取模,凉凉. 首先有个一眼就能看出来的规律... 斐波那契数列满足$a_1, a_2, a_1+a_2, a_1+2a_2, 2a_1+3a_2, 3a_1+5a_ ...
- 【LibreOJ】#6259. 「CodePlus 2017 12 月赛」白金元首与独舞
[题目]给定n行m列的矩阵,每个位置有一个指示方向(上下左右)或没有指示方向(任意选择),要求给未定格(没有指示方向的位置)确定方向,使得从任意一个开始走都可以都出矩阵,求方案数.n,m<=20 ...
- 【LIbreOJ】#6256. 「CodePlus 2017 12 月赛」可做题1
[题意]定义一个n阶正方形矩阵为“巧妙的”当且仅当:任意选择其中n个不同行列的数字之和相同. 给定n*m的矩阵,T次询问以(x,y)为左上角的k阶矩阵是否巧妙.n,m<=500,T<=10 ...
- 【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 ...
- 「CodePlus 2017 12 月赛」白金元首与独舞
description 题面 data range \[ 1 \leq T \leq 10, 1 \leq n, m \leq 200 , 0 \leq k \leq \min(nm, 300)\] ...
- 走进矩阵树定理--「CodePlus 2017 12 月赛」白金元首与独舞
n,m<=200,n*m的方阵,有ULRD表示在这个格子时下一步要走到哪里,有一些待决策的格子用.表示,可以填ULRD任意一个,问有多少种填法使得从每个格子出发都能走出这个方阵,答案取模.保证未 ...
- loj6259「CodePlus 2017 12 月赛」白金元首与独舞
分析 我们将没连的点连向周围四个点 其余的按照给定的方向连 我们将所有连出去的位置统一连到0点上 再以0作为树根 于是就将问题转化为了有向图内向树计数 代码 #include<iostream& ...
随机推荐
- [转]Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application (3 of 10)
本文转自:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/sorting-fi ...
- C#菜鸟正则表达式一
LZ菜鸟,仅整理笔记,顺带记录一下,谓之增加印象. LZ认为,没必要太纠结原理,模型, 屌丝能用就对了,剩下的事情用多了自然会去探索. 中文:正则表达式,英文:Regular ExPression, ...
- AJPFX解析成员变量和局部变量
成员变量和局部变量 3.1.成员变量和局部变量 A:在类中的位置不同 * 成员变量:在类中方法外 * 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 ...
- LN : leetcode 123 Best Time to Buy and Sell Stock III
lc 123 Best Time to Buy and Sell Stock III 123 Best Time to Buy and Sell Stock III Say you have an a ...
- Android 图片文件和Bitmap之间的转换
String filePath="c:/01.jpg"; Bitmap bitmap=BitmapFactory.decodeFile(filePath); 如果图片过大,可能导致 ...
- 详解Android Activity生命周期
转载注明来自: http://www.cnblogs.com/wujiancheng/ 一.正常情况下Activity的生命周期: Activity的生命周期大概可以归为三部分 整个的生命周期:o ...
- hibernate对象状态 的小问题
Class classA{ List a; public void setA(List a) { this.a =a; } public List getA() { return this.a; } ...
- 【C++】异常简述(三):补充之如何看待C++异常
C++异常的使用,我相信在上文总结的已经比较完整了,本文主要对C++异常这块进行额外的补充. 即使C++将异常纳入标准已经很多年了,但是直到现在都能看到很多坚持不显式使用异常.(包括本人在内,在写的代 ...
- boostrapvalidator
一个例子 <%@ page contentType="text/html;charset=UTF-8" language="java" %> < ...
- 安装gitlab并配置邮箱
安装要求:运行内存必须大于等于2G 一.安装docker wget -qO- https://get.docker.com/ | sh 镜像加速: echo '{"registry-mirr ...