P1110 [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_GAP22,MIN_SORT_GAP22。

再执行操作INSERT 2 6将得到:5, 3, 9, 6, 1

注意这个时候原序列的第2个元素后面已经添加了一个9,此时添加的6应加在9的后面。这个时候MIN_GAP2MIN_SORT_GAP1

于是小Q写了一个程序,使得程序可以自动完成这些操作,但是他发现对于一些大的报表他的程序运行得很慢,你能帮助他改进程序么?

输入输出格式

输入格式:

 

第一行包含两个整数NM,分别表示原数列的长度以及操作的次数。

第二行为N个整数,为初始序列。

接下来的M行每行一个操作,即INSERT i kMIN_GAPMIN_SORT_GAP 中的一种(无多余空格或者空行)。

 

输出格式:

 

对于每一个MIN_GAPMIN_SORT_GAP命令,输出一行答案即可。

 

输入输出样例

输入样例#1: 
3 5
5 3 1
INSERT 2 9
MIN_SORT_GAP
INSERT 2 6
MIN_GAP
MIN_SORT_GAP
输出样例#1: 
2
2
1

说明

对于30%的数据,N ≤ 1000 ,M ≤ 5000
对于100%的数据,N ,M ≤500000
对于所有的数据,序列内的整数不超过5×108

时限2s

 

Solution:

  本题splay+堆(好水啊,乱打的代码都能AC~)。

  分析题目:

    操作1,加入一个数,只会改变相邻的关系,所以数组模拟随便乱搞维护下相邻关系。

    操作2,加入一个数,改变的是两对相邻的差值,所以可以直接用带修改的堆去维护(pbds大法好!)。

    操作3,由于是维护全局最小值,那么只需要在加入数时,在其插入二叉搜索树的遍历过程中,与访问过的节点更新下答案,当然为了保证树的平衡,选用平衡树写写就行了。

代码:

/*Code by 520 -- 9.17*/
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/priority_queue.hpp>
#define il inline
#define ll long long
#define RE register
#define For(i,a,b) for(RE int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(RE int (i)=(b);(i)>=(a);(i)--)
#define son(x) (x==ch[fa[x]][1])
using namespace std;
using namespace __gnu_pbds;
const int N=1000005;
int n,m,a[N<<1][2],tot,val[N<<1];
int root,ch[N][2],fa[N],cnt,date[N];
int minn=0x7fffffff;
struct node{int ls,rs,val;bool operator < (const node &a) const {return val>a.val;}
};
typedef __gnu_pbds::priority_queue<node,less<node>,pairing_heap_tag> heap;
heap q;
heap::point_iterator id[N];int gi(){int a=0;char x=getchar();bool f=0;while((x<'0'||x>'9')&&x!='-') x=getchar();if(x=='-') x=getchar(),f=1;while(x>='0'&&x<='9') a=(a<<3)+(a<<1)+(x^48),x=getchar();return f?-a:a;
}il void rotate(int x){int y=fa[x],z=fa[y],b=son(x),c=son(y),a=ch[x][!b];z?ch[z][c]=x:root=x; fa[x]=z;if(a) fa[a]=y; ch[y][b]=a;ch[x][!b]=y,fa[y]=x;
}il void splay(int x,int i){while(fa[x]!=i){RE int y=fa[x],z=fa[y];if(z==i) rotate(x);else {if(son(x)==son(y)) rotate(y),rotate(x);else rotate(x),rotate(x);}}
}void insert(int &rt,int x){if(!rt) {rt=++cnt,date[cnt]=x;return;}if(date[rt]==x) {minn=0;return;}if(x<date[rt])insert(ch[rt][0],x),fa[ch[rt][0]]=rt,minn=min(minn,abs(date[rt]-x));else insert(ch[rt][1],x),fa[ch[rt][1]]=rt,minn=min(minn,abs(date[rt]-x));    
}int main(){int pos,x; char s[10];n=gi(),m=gi(),tot=n;For(i,1,n) {val[i]=gi(),insert(root,val[i]),splay(cnt,0);if(i!=1) a[i][0]=i;if(i!=n) a[i][1]=i;}For(i,2,n) id[i]=q.push(node{i,i+1,abs(val[i]-val[i-1])});while(m--){scanf("%s",s);if(s[0]=='I') {pos=gi(),val[++tot]=gi(),insert(root,val[tot]),splay(cnt,0);int tp=a[pos][1];id[tot]=q.push(node{tot,tp,abs(val[tp]-val[tot])});if(pos!=n) q.modify(id[pos+1],node{pos+1,tot,abs(val[pos+1]-val[tot])});a[pos+1][0]=tot,a[pos][1]=tot;}else if(strlen(s)==7) printf("%d\n",q.top().val);else printf("%d\n",minn);}return 0;
}

 

转载于:https://www.cnblogs.com/five20/p/9665522.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485084.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

斯坦福 AI 课程 10 年发展史

作者&#xff1a;Rachel Oh 、Peter Maldonado转自&#xff1a;机器之心编辑&#xff1a;杜伟、小舟在人工智能领域&#xff0c;斯坦福大学的很多课程都颇受欢迎&#xff0c;如 CS 224N 深度学习自然语言处理和 CS 229 机器学习。这些课程如何一步步发展成为今天的热门课程&…

Leetcode--820:单词的压缩编码(java)

给定一个单词列表&#xff0c;我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。 例如&#xff0c;如果这个列表是 ["time", "me", "bell"]&#xff0c;我们就可以将其表示为 S "time#bell#" 和 indexes [0, 2, 5]。 对于…

Leetcode--130. 被围绕的区域(java)

给定一个二维的矩阵&#xff0c;包含 X 和 O&#xff08;字母 O&#xff09;。 找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 示例: X X X X X O O X X X O X X O X X 运行你的函数后&#xff0c;矩阵变为&#xff1a; X X X X X X X X X X X X…

6G技术长啥样?5大趋势,13个核心技术2030年落地

来源&#xff1a;智东西5G已经展开了全面商用&#xff0c;随着5G在垂直行业的不断渗透&#xff0c;人们对于6G的设想也逐步提上日程。面向2030, 6G将在5G基础上全面支持整个世界的数字化&#xff0c;并结合人工智能等技术的发展&#xff0c;实现智慧的泛在可取、全面赋能万事万…

微积分的未来:DNA、非线性、混沌、复杂系统与人工智能

导语微积分是人类历史上的伟大思想成就之一&#xff0c;也是数学领域不可或缺的一个重要分支。如果没有微积分&#xff0c;人类就不可能发明电视、微波炉、移动电话、GPS、激光视力矫正手术、孕妇超声检查&#xff0c;也不可能发现冥王星、破解人类基因组、治疗艾滋病&#xff…

Leetcode--1111. 有效括号的嵌套深度(Java)

有效括号字符串 仅由 "(" 和 ")" 构成&#xff0c;并符合下述几个条件之一&#xff1a; 空字符串 连接&#xff0c;可以记作 AB&#xff08;A 与 B 连接&#xff09;&#xff0c;其中 A 和 B 都是有效括号字符串 嵌套&#xff0c;可以记作 (A)&#xff0c…

计蒜客第三场

1、有序数组查找 假设一个数组&#xff0c;事先在你未知的情况下&#xff0c;以某一点分段有序排列。比如&#xff1a;&#xff08;0,0,0,1,2,2,3 变成 0,0,1,2,2,3,0&#xff0c;定需要查找的数&#xff0c;在当前数组中查找&#xff0c;存在&#xff0c;返回ture&#xff0c;…

美国防部官员讨论量子科学、5G和定向能的发展

来源&#xff1a;国防科技要闻3月8日&#xff0c;美国防部国防研究与工程办公室负责现代化建设的三名官员在国防工业协会太平洋作战科技虚拟会议上讨论了量子科学、5G和定向能的发展。量子科学量子科学主要负责人保罗洛帕塔表示&#xff0c;国防部在过去的二三十年里一直在进行…

牛客网--密码验证合格程序(Java)

题目描述 密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能有相同长度超2的子串重复 说明:长度超过2的子串 输入描述: 一组或多组长度超过2的子符串。每组占一行 输出描述: 如果符合要求输出&#xff1a;OK&#xff0c;否则输出NG 示例1 输…

9-18 学习如何使用Python包的管理

前提是安装好Anaconda 1.如何安装一个包 这里的语句 package_name为包的名字 例如 你可以在cmd窗口下输入 按下回车后 系统将会进行安装numpy包。 你也可以同时安装多个包&#xff0c;比如同时安装numpy、scipy、pandas包。 命令如下 注&#xff1a;numpy&#xff1a;是Python的…

牛客--合唱队

题目描述 计算最少出列多少位同学&#xff0c;使得剩下的同学排成合唱队形 说明&#xff1a; N位同学站成一排&#xff0c;音乐老师要请其中的(N-K)位同学出列&#xff0c;使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设K位同学从左到右依次编号…

java连接hbase时出现....is accessible from more than one module:

今天在用java程序连接hbase时&#xff0c;出现错误&#xff0c;The package org.apache.hadoop.hbase is accessible from more than one module: &#xff0c;在网上百度也没能找出答案&#xff0c;但是经过很长时间的查找之后中遇找到了原因&#xff0c;那就是我自导入jar包时…

AR行业发展现状:定义、技术原理及商业价值

文章来源&#xff1a;AR工业应用资料源自网络《Pokemon Go》这款游戏能够大火&#xff0c;除了一个好的IP之外。AR技术也功不可没。而在AR发光之后&#xff0c;什么是AR&#xff1f;它的技术原理是怎么样的&#xff0c;它能够具备哪些商业价值&#xff1f;希望通过这篇文章&…

基础学科如何不再“又难又穷”

来源&#xff1a;光明日报投身基础学科意味着什么——“奉献”“冷板凳”“异常艰苦”……也许&#xff0c;这是横亘在数十年间&#xff0c;大学生选报志愿时对“基础学科”的“刻板印象”。在知乎、豆瓣等大学生汇集的社交网站上&#xff0c;谈到基础学科&#xff0c;一位叫刘…

配置 Docker 加速器

Linux curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、op…

Leetcode--72.编辑距离(java)

给你两个单词 word1 和 word2&#xff0c;请你计算出将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "horse", word2 "…

2021年阿贝尔奖公布!理论计算机科学和离散数学领域学者获奖

来源&#xff1a;前瞻网3月17日&#xff0c;2021年阿贝尔奖揭晓。挪威科学和文学院决定将2021年阿贝尔奖授予来自匈牙利&#xff0c;布达佩斯罗兰大学的Lszl Lovsz 和来自美国&#xff0c;普林斯顿高等研究院的 Avi Wigderson&#xff0c;以表彰两位科学家在理论计算机科学和离…

path环境变量丢失恢复

path环境变量不小心丢失&#xff0c;查询到的恢复方法记录一下 WindowsR键&#xff0c;打开&#xff1a;regedit后点击确定按钮 依次按照这个步骤找到path&#xff0c;鼠标右键修改&#xff0c;复制值到path环境变量中就可以了 转载于:https://www.cnblogs.com/liangcl/p/96797…

【剑指offer】面试题07. 重建二叉树(Java)

输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3 / \ 9 20 …

GPU深度报告,三大巨头,十四个国内玩家一文看懂【物联网智商精选】

来源: 智东西编辑&#xff1a;智东西内参关于GPU&#xff0c;你想知道的都在这里了。GPU是Graphics Processing Unit&#xff08;图形处理器&#xff09;的简称&#xff0c;它是一种专门在个人电脑、工作站、游戏机和一些移动设备&#xff08;如平板电脑、智能手机等&#xff0…