[补档][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发现统计一张报表实际上是维护一个非 ...
随机推荐
- python 标准库 -- threading
threading : 提高对网络端口的读写效率. threading.Thread.start() 执行线程操作 threading.Thread.run() 执行线程操作 threading.Th ...
- 如何卸载CentOS自带的apache
查看安装的组件: rpm -qa | grep httpd 如果预装有apache,那么会显示像httpd-2.2.3-22.el5.centos这种的组件名. 卸载组件: rpm -e httpd- ...
- 【Android Developers Training】 68. 序言:添加动画
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 亲测有效!一种完美动态阈值白平衡算法 Java实现。
几年没发文了,重新拿起技术! 最近做图像处理,要自动处理颜色平衡问题,很多什么直方图优化之类的,都不完美.所以在博客园找到了这个前辈的文章. http://www.cnblogs.com/Images ...
- 3.jsp基本语法笔记
1.page标签 <%@ page language="java" import="java.util.*" contentType="text ...
- JVM总结之内存区域
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,有的区域是线程共享的,有的区域是线程隔离的.如下图: 程序计数器 程序计数器(Progra ...
- 网页在ios下点击无效的原因
之前在做一个项目的时候,发现元素在ios系统中点击无法触发效果,网上查了一下发现 ios下 如果不是button,input这类标签的话 ,如果有点击事件的话最好给加一个css样式cursor:p ...
- java基础之集合框架(1)
一.介绍Collection 1.概念:Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection ...
- 【干货】Chrome插件(扩展)开发全攻略(不点进来看看你肯定后悔)
写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这个demo里面:https://github ...
- JavaScript实现淡入淡出
<!DOCTYPE html> <html> <head> <title>css动画</title> </head> <b ...