[补档][ZJOI2007] 报表统计
[ZJOI2007] 报表统计
题目
小Q的妈妈是一个出纳,经常需要做一些统计报表的工作。今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一。经过仔细观察,小Q发现统计一张报表实际上是维护一个非负整数数列,并且进行一些查询操作。在最开始的时候,有一个长度为N的整数序列,并且有以下三种操作:INSERT i k在原数列的第i个元素后面添加一个新元素k;如果原数列的第i个元素已经添加了若干元素,则添加在这些元素的最后(见下面的例子)MIN_GAP查询相邻两个元素的之间差值(绝对值)的最小值MIN_SORT_GAP查询所有元素中最接近的两个元素的差值(绝对值)例如一开始的序列为5 3 1执行操作INSERT 2 9将得到:5 3 9 1此时MIN_GAP为2,MIN_SORT_GAP为2。再执行操作INSERT 2 6将得到:5 3 9 6 1注意这个时候原序列的第2个元素后面已经添加了一个9,此时添加的6应加在9的后面。这个时候MIN_GAP为2,MIN_SORT_GAP为1。于是小Q写了一个程序,使得程序可以自动完成这些操作,但是他发现对于一些大的报表他的程序运行得很慢,你能帮助他改进程序么?INPUT
输入文件form.in第一行包含两个整数N,M,分别表示原数列的长度以及操作的次数。第二行为N个整数,为初始序列。接下来的M行每行一个操作,即“INSERT i k”,“MIN_GAP”,“MIN_SORT_GAP”中的一种(无多余空格或者空行)。OUTPUT
对于每一个“MIN_GAP”和“MIN_SORT_GAP”命令,输出一行答案即可。SAMPLE
INPUT
3 55 3 1INSERT 2 9MIN_SORT_GAPINSERT 2 6MIN_GAPMIN_SORT_GAPOUTPUT
221数据规模
对于30%的数据,N≤ 1000 , M ≤ 5000对于100%的数据,N , M ≤500000对于所有的数据,序列内的整数不超过5×10^8。
解题报告
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<set>
using namespace std;
inline int read(){
int sum(),f();
char ch(getchar());
for(;ch<''||ch>'';ch=getchar())
if(ch=='-')
f=-;
for(;ch>=''&&ch<='';sum=sum*+(ch^),ch=getchar());
return sum*f;
}
priority_queue<int,vector<int>,greater<int> >dust;
priority_queue<int,vector<int>,greater<int> >ans1;
vector<int>v[];
multiset<int>st;
multiset<int>::iterator it;
int n,m;
int w[];
int ans2(0x7fffffff);
char op[];
inline int my_max(int a,int b){
return a>b?a:b;
}
inline int my_min(int a,int b){
return a<b?a:b;
}
inline int jdz(int x){
return x>=?x:-x;
}
inline void insert(int x,int y){
int size(v[x].size());
if(x<n)
dust.push(jdz(v[x][size-]-v[x+][]));
ans1.push(jdz(y-v[x][size-]));
if(x<n)
ans1.push(jdz(y-v[x+][]));
v[x].push_back(y);
st.insert(y);
it=st.find(y);
if(it!=st.begin()){
it--;
int tmp(*it);
ans2=my_min(jdz(y-tmp),ans2);
it++;
}
if(it!=st.end()){
it++;
int tmp(*it);
ans2=my_min(jdz(y-tmp),ans2);
}
}
inline int query(){
while(){
if(dust.empty()||dust.top()!=ans1.top())
break;
dust.pop();
ans1.pop();
}
return ans1.top();
}
int main(){
freopen("form.in","r",stdin);
freopen("form.out","w",stdout);
n=read(),m=read();
for(int i=;i<=n;i++){
w[i]=read();
st.insert(w[i]);
it=st.find(w[i]);
if(it!=st.begin()){
it--;
int tmp(*it);
ans2=my_min(ans2,jdz(tmp-w[i]));
it++;
}
if(it!=st.end()){
it++;
int tmp(*it);//cout<<tmp<<endl;
ans2=my_min(ans2,jdz(tmp-w[i]));
}
if(i^)
ans1.push(jdz(w[i]-w[i-]));
v[i].push_back(w[i]);
// cout<<i<<' '<<w[i]<<' '<<ans2<<endl;
}
while(m--){
scanf("%s",op);
if(op[]=='I'){
int x(read()),y(read());
insert(x,y);
}
else{
if(strlen(op)<)
printf("%d\n",query());
else
printf("%d\n",ans2);
}
}
}
[补档][ZJOI2007] 报表统计的更多相关文章
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
- BZOJ_1058_[ZJOI2007]报表统计_STL
BZOJ_1058_[ZJOI2007]报表统计_STL Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工 作,作为她的生日礼 ...
- bzoj 1058: [ZJOI2007]报表统计 (Treap)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1058 题面; 1058: [ZJOI2007]报表统计 Time Limit: 15 Sec ...
- 洛谷 P1110 [ZJOI2007]报表统计 解题报告
P1110 [ZJOI2007]报表统计 题目描述 \(Q\)的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小\(Q\)希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细 ...
- bzoj P1058 [ZJOI2007]报表统计——solution
1058: [ZJOI2007]报表统计 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4099 Solved: 1390 [Submit][St ...
- 【BZOJ1058】[ZJOI2007]报表统计 STL
[BZOJ1058][ZJOI2007]报表统计 Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经 ...
- [ZJOI2007]报表统计(splay,堆)
[ZJOI2007]报表统计(luogu) Description 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. ...
- 1058: [ZJOI2007]报表统计 - BZOJ
Description 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一.经过仔细观察,小Q发现统计一张报表实际上是维护一个非 ...
随机推荐
- js 过滤敏感词 ,可将带有标点符号的敏感词过滤掉
function transSensitive(content) { // var Sensitive = H.getStorage("Sensitive");//敏感词数组 va ...
- SICP-2.2-数据的抽象
数据的抽象 生活中有许多的事物具有复合结构,例如地理位置所用的经纬度,便是通过一个复合结构来代表位置,在我们的程序当中,我们设法将经度纬度组合成一对,我们既可以把他们当做一个整体单元来进行操作,而且也 ...
- Ubuntu命令模式基础
Ubuntu是一个自由.开源.基于Debian的Linux发行版.在ubuntu的基础上,又衍生其它各具特色的Linux发行版.首先是一个操作系统,操作系统用于管理电脑硬件.要发挥出电脑的作用,还得依 ...
- 查找oracle自己用户的表
查找oracle自己用户的表 select table_name from user_tables;
- mysql 列类型以及属性特点
整形列: 一个字节有8个位,例如:int 类型的列存入数字1,00000000 00000000 00000000 00000001它就在最低位置上存入一个1,由此可见是极大的浪费资源,所以在建立列类 ...
- 【LeetCode】66. Plus One
题目: Given a non-negative number represented as an array of digits, plus one to the number. The digit ...
- Linux ls命令详解
ls 命令可以说是Linux下最常用的命令之一. -a 列出目录下的所有文件,包括以 . 开头的隐含文件.(后有详解)-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在c语言里一样)的形式列出. ...
- H5在线编辑器优化总结
花了三个半月做了个编辑器.自己一个人写写CSS,搞搞html,弄下JS,大部分精力都是掏鼓js,时间很仓促,后面领导帮忙写了四个页面逻辑(音频,图片,视频). 很多能优化的,以此文章记录要已经优化和未 ...
- thinkphp的空控制器和空操作以及对应解决方法
在上篇随笔中我们已经知道了tp框架的四种访问方式,那么当在地址栏输入不存在的操作方法.控制器会怎么样呢? 先看一下定义: 空操作:一个对象(控制器)调用本身不存在的方法 空控制器:在实例化控制器对象的 ...
- VB6之SendMessage模拟拖放事件
原文链接:http://hi.baidu.com/coo_boi/item/e1e0f5ab45bddbdd5af191df 网上找了个C++的翻一下,原文链接:http://www.cnblogs. ...