[luogu1110][报表统计]
思路
set+map+优先队列就可以水过去。可以发现,每插入一个元素,都会使得操作2中原来相邻的那个差值消失,然后多了两个新的差值。对于新的差值,只要直接扔到优先队列里就好了。那么删除呢。可以用map记录一下当前元素被删除了多少次。然后查询的时候将被删除的跳过即可。对于操作3,只要将插入的数都扔到set里,然后每次插入都找出当前点的前驱后继,并用ans记录下最优的。查询的时候直接输出ans即可。
为了证明自己真的有在练习平衡树,写了个splay代替set,然后跑的比set还慢2333。还可以再写一棵平衡树,来代替map+优先队列的操作。
STL代码
/*
* @Author: wxyww
* @Date: 2018-12-09 19:19:23
* @Last Modified time: 2018-12-09 19:56:45
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<set>
#include<cstring>
#include<cmath>
#include<map>
#include<ctime>
#include<queue>
#include<bitset>
using namespace std;
typedef long long ll;
const int N = 1000000 + 100,INF = 1e9;
map<int,int>ma;
priority_queue<int,vector<int>,greater<int> >q;
set<int>s;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
int a[N],lianbiao[N],now[N];
char c[20];
set<int>::iterator k1,k2;
int ans1 = INF,ans2 = INF;
int main() {
int n = read(),m = read();
memset(a,-0x3f,sizeof(a));
s.insert(-INF);s.insert(INF);
for(int i = 1;i <= n;++i) {
a[i] = read();
lianbiao[i - 1] = i;
k1 = --s.lower_bound(a[i]);k2 = s.lower_bound(a[i]);
ans2 = min(ans2,min(abs(*k1 - a[i]),abs(*k2 - a[i])));
q.push(abs(a[i] - a[i - 1]));
s.insert(a[i]);
now[i] = i;
}
while(m--) {
scanf("%s",c + 1);
if(c[1] == 'I') {
int pos = read();
a[++n] = read();
int k = now[pos];
ma[abs(a[k] - a[lianbiao[k]])]++;
q.push(abs(a[n] - a[k]));q.push(abs(a[n] - a[lianbiao[k]]));
k1 = --s.lower_bound(a[n]);k2 = s.lower_bound(a[n]);
ans2 = min(ans2,min(abs(*k1 - a[n]),abs(*k2 - a[n])));
s.insert(a[n]);
now[pos] = n;
lianbiao[n] = lianbiao[k];
lianbiao[k] = n;
}
else if(c[6] == 'A') {
int z = q.top();
while(ma[z]) {
q.pop();
ma[z]--;
z = q.top();
}
printf("%d\n",z);
}
else printf("%d\n",ans2);
}
return 0;
}
splay代码
/*
* @Author: wxyww
* @Date: 2018-12-09 16:29:51
* @Last Modified time: 2018-12-09 20:32:00
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<map>
#include<queue>
#include<ctime>
#include<bitset>
using namespace std;
#define ls TR[cur].ch[0]
#define rs TR[cur].ch[1]
typedef long long ll;
const int N = 1000000 + 100,INF = 1e9;
ll read() {
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
struct node {
int ch[2],val,siz,pre,cnt;
}TR[N];
inline void up(int cur) {
TR[cur].siz = TR[ls].siz + TR[rs].siz + TR[cur].cnt;
}
int tot,rt;
inline int getwh(int cur) {
return TR[TR[cur].pre].ch[1] == cur;
}
inline void rotate(int cur) {
int f = getwh(cur),fa = TR[cur].pre,gr = TR[fa].pre;
TR[cur].pre = gr;
TR[gr].ch[getwh(fa)] = cur;
TR[TR[cur].ch[f ^ 1]].pre = fa;
TR[fa].ch[f] = TR[cur].ch[f ^ 1];
TR[fa].pre = cur;
TR[cur].ch[f ^ 1] = fa;
up(fa);up(cur);
}
void splay(int cur,int to) {
while(TR[cur].pre != to) {
if(TR[TR[cur].pre].pre != to) {
if(getwh(cur) == getwh(TR[cur].pre)) rotate(TR[cur].pre);
else rotate(cur);
}
rotate(cur);
}
if(!to) rt = cur;
}
void insert(int cur,int val,int father) {
if(!cur) {
cur = ++tot;
TR[cur].pre = father;
TR[cur].val = val;
TR[cur].siz = TR[cur].cnt = 1;
TR[father].ch[val > TR[father].val] = cur;
splay(cur,0);
return;
}
TR[cur].siz++;
if(val == TR[cur].val) {TR[cur].cnt++;return;}
insert(TR[cur].ch[val > TR[cur].val],val,cur);
}
inline int getpos(int val) {
int cur = rt,lst;
while(cur) {
lst = cur;
if(TR[cur].val == val) return cur;
if(val > TR[cur].val) cur = rs;
if(val < TR[cur].val) cur = ls;
}
return lst;
}
inline int pred(int val) {
int cur = getpos(val);
if(TR[cur].val <= val) return TR[cur].val;
splay(cur,0);
cur = ls;
while(rs) cur = rs;
return TR[cur].val;
}
inline int nex(int val) {
int cur = getpos(val);
if(TR[cur].val >= val) return TR[cur].val;
splay(cur,0);
cur = rs;
while(ls) cur = ls;
return TR[cur].val;
}
int a[N],lianbiao[N],now[N];
char c[20];
int ans1 = INF,ans2 = INF;
map<int,int>ma;
priority_queue<int,vector<int>,greater<int> >q;
int main() {
int n = read(),m = read();
memset(a,-0x3f,sizeof(a));
insert(rt,-INF,0);insert(rt,INF,0);
for(int i = 1;i <= n;++i) {
a[i] = read();
lianbiao[i - 1] = i;
// puts("!!");
int k1 = pred(a[i]),k2 = nex(a[i]);
ans2 = min(ans2,min(abs(k1 - a[i]),abs(k2 - a[i])));
q.push(abs(a[i] - a[i - 1]));
insert(rt,a[i],0);
now[i] = i;
}
while(m--) {
scanf("%s",c + 1);
if(c[1] == 'I') {
int pos = read();
a[++n] = read();
int k = now[pos];
ma[abs(a[k] - a[lianbiao[k]])]++;
q.push(abs(a[n] - a[k]));q.push(abs(a[n] - a[lianbiao[k]]));
int k1 = pred(a[n]),k2 = nex(a[n]);
ans2 = min(ans2,min(abs(k1 - a[n]),abs(k2 - a[n])));
insert(rt,a[n],0);
now[pos] = n;
lianbiao[n] = lianbiao[k];
lianbiao[k] = n;
}
else if(c[6] == 'A') {
int z = q.top();
while(ma[z]) {
q.pop();
ma[z]--;
z = q.top();
}
printf("%d\n",z);
}
else printf("%d\n",ans2);
}
return 0;
}
一言
积极者相信只有推动自己才能推动世界,只要推动自己就能推动世界。
[luogu1110][报表统计]的更多相关文章
- bzoj1058: [ZJOI2007]报表统计
set.操作:insert(u,v)在u后面插入v,若u后面已插入过,在插入过的后面插入.mingap求出序列两两之间差值的最小值.minsortgap求出排序后的序列两两之间的最小值.用multis ...
- BZOJ 1058: [ZJOI2007]报表统计( 链表 + set )
这种题用数据结构怎么写都能AC吧...按1~N弄个链表然后每次插入时就更新答案, 用set维护就可以了... --------------------------------------------- ...
- [补档][ZJOI2007] 报表统计
[ZJOI2007] 报表统计 题目 传送门 小Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观察,小Q发现统计一 ...
- 【BZOJ1058】【ZJOI2007】报表统计(链表,堆,Splay)
[BZOJ1058][ZJOI2007]报表统计 题面 题目描述 Q的妈妈是一个出纳,经常需要做一些统计报表的工作.今天是妈妈的生日,小Q希望可以帮妈妈分担一些工作,作为她的生日礼物之一. 经过仔细观 ...
- 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 ...
- 基于Fusioncharts的报表统计
先了解fusioncharts插件,fusioncharts是一款基于XML和flash的报表组件,支持Java.PHP.AngularJS等等开发语言,所以,开发出来,加入swf文件,就可以出现动态 ...
- 洛谷 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 ...
随机推荐
- servlet中将值以json格式传入
详细连接https://blog.csdn.net/e_wsq/article/details/71038270$('#but_json_json').click(function(){ }; $.a ...
- bootStrap的使用
1.首先要打开bootstrap的官网 点进去 2你会看到下面这样一个页面里面有很多组件 这里面的代码是实现组件功能的核心代码,还不能直接使用,要引入相关的js css 我们要在起步中下载相关的页面下 ...
- nginx 卸载后重新安装/etc/nginx配置文件没了,cannot open /etc/nginx/nginx.conf (No such file or directory)
sudo apt-get --purge remove nginx-common sudo apt-get --purge remove nginx* sudo apt-get autoremove ...
- JS--操作DOM树
<ul id="ul1"> <li id="li1">111</li> <li id="li2"& ...
- LDOOP设置关联后超出新起一页LinkNewPage
关联打印的时候,top,left关联位置是相对于被关联打印项的偏移值,具体可查看本博客相关介绍博文:LODOP打印控件关联输出各内容 正常情况下,超文本超过打印项高度,或纸张高度会自动分页,如果超文本 ...
- 【理论】X理论、Y理论及Z理论
道格拉斯·麦格雷戈(Douglas Mcgregor)把对人的基本假设作了区分,即X理论和Y理论.X理论认为:人们总是尽可能地逃避工作,不愿意承担责任,因此要想有效地进行管理,实现组织的目标,就必 ...
- Spring Boot 构建电商基础秒杀项目 (七) 自动校验
SpringBoot构建电商基础秒杀项目 学习笔记 修改 UserModel 添加注解 public class UserModel { private Integer id; @NotBlank(m ...
- Web API2 使用EF Code Migrations to Seed DB
console Enable-Migrations 运行这个命令,添加一个文件夹Migrations,Configuration.cs在这文件夹中 打开 Configuration.cs file. ...
- Nginx websocket反向代理
L:106 现在主流的反向代理,通过长链接可以从服务器推送数据到页面 升级成websocket反向代理必须根据上面的配置做配置 缺点无法多路复用,也就是没办法并行 我们测试下Websocket反向代理 ...
- python optparser模块
python的内置模块中对于命令行的解析模块共两个getopt 和 optparse .不过getopt过于简单,往往不能满足需求.此时可以使用optparse模块.这个模块相对于getopt更新,功 ...