COGS 723. [SDOI2007] 超级数组
★★☆ 输入文件:arr.in 输出文件:arr.out 简单对比
时间限制:1 s 内存限制:3 MB
Source: SDOI2007 Day2
【问题描述】
一般的数组大家都经常使用,相信很多同学没有见过下面的超级数组。
超级数组存储的是一些正整数,它还支持下面的两个操作
(1)、插入一个元素,命令是 "i key" 。 key 是要插入的数。
(2)、输出第 k 大元素并删除该元素,命令是 "d k"。输出第 k 大元素并删除它。
“第 k 大”是指:现有的数中,如果从小到大排好序,从最小的开始作为第一大算起,
一直数到第 k 个。
现在给出一个开始是空的超级数组,请维护好该数组。
【输入】(arr.in)
第一行 n、m:n<=1 000 000 000 , m<=100 000。表示插入数的范围是 1 至n ,共有m 条命令(包括插入和删除)。
以下 m 行,每行一条命令,如题中描述。每条命令中字母和后面的数字之间一个空格。
保证输入数据是正确的,删除的数一定存在。
【输出】(arr.out)
对于每个删除命令,按删除命令顺序输出删除的数,每个数一行
【样例输入】
100 10
i 57
i 99
i 65
d 3
i 89
d 2
d 2
d 1
i 93
i 29
【样例输出】
99
65
89
57
SBT模板题。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int maxn=;
int key[maxn],siz[maxn],lc[maxn],rc[maxn];
int root,tot;
int N,M;
char s[];
void r_rotate(int &rt){
int k=lc[rt];
lc[rt]=rc[k];
rc[k]=rt;
siz[k]=siz[rt];
siz[rt]=siz[lc[rt]]+siz[rc[rt]]+;
rt=k;
}
void l_rotate(int &rt){
int k=rc[rt];
rc[rt]=lc[k];
lc[k]=rt;
siz[k]=siz[rt];
siz[rt]=siz[lc[rt]]+siz[rc[rt]]+;
rt=k;
}
void Maintain(int &rt,bool flag){
if(flag==false){
if(siz[lc[lc[rt]]]>siz[rc[rt]]) r_rotate(rt);
else if(siz[rc[lc[rt]]]>siz[rc[rt]]){
l_rotate(lc[rt]);
r_rotate(rt);
}
else return ;
}
else{
if(siz[rc[rc[rt]]]>siz[lc[rt]]) l_rotate(rt);
else if(siz[lc[rc[rt]]]>siz[lc[rt]]){
r_rotate(rc[rt]);
l_rotate(rt);
}
else return ;
}
Maintain(lc[rt],false); Maintain(rc[rt],true);
Maintain(rt,false); Maintain(rt,true);
}
void insert(int &rt,int v){
if(rt==){
rt=++tot;
key[rt]=v;
siz[rt]=; lc[rt]=rc[rt]=;
return ;
}
siz[rt]++;
if(v<=key[rt]) insert(lc[rt],v);
else insert(rc[rt],v);
Maintain(rt,false); Maintain(rt,true);
}
int Delete(int &rt,int v){
int ans;
siz[rt]--;
if(v==key[rt]||(v<key[rt]&&lc[rt]==)||(v>key[rt]&&rc[rt]==)){
ans=key[rt];
if(lc[rt]==||rc[rt]==) rt=lc[rt]+rc[rt];
else key[rt]=Delete(lc[rt],key[rt]+);
return ans;
}
if(v<key[rt]) ans=Delete(lc[rt],v);
else ans=Delete(rc[rt],v);
return ans;
}
bool find(int &rt,int v){
if(rt==) return false;
if(v==key[rt]) return true;
if(v<key[rt]) return find(lc[rt],v);
if(v>key[rt]) return find(rc[rt],v);
}
int select(int &rt,int v){
if(v==siz[lc[rt]]+) return key[rt];
else if(v<siz[lc[rt]]+) return select(lc[rt],v);
else return select(rc[rt],v-siz[lc[rt]]-);
}
int main(){
freopen("arr.in","r",stdin);
freopen("arr.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=,tmp;i<=M;i++){
scanf("%s%d",s,&tmp);
if(s[]=='i') insert(root,tmp);
else{
int ans=select(root,tmp);
printf("%d\n",ans);
Delete(root,ans);
}
}
return ;
}
COGS 723. [SDOI2007] 超级数组的更多相关文章
- 【题解】回文串 APIO 2014 BZOJ 3676 COGS 1985 Manacher+后缀数组+二分
这题可以用回文自动机来做,但是我并没有学,于是用Manacher+SA的做法O(nlogn)水过 首先,看到回文串就能想到用Manacher 同样还是要利用Manacher能不重复不遗漏地枚举每个回文 ...
- 贪心(数据结构):COGS 468. [NOI2010]超级钢琴
★★★☆ 输入文件:piano.in 输出文件:piano.out 简单对比 时间限制:2 s 内存限制:512 MB 超级钢琴 [问题描述] 小Z是一个小有名气的钢琴家,最近C博士送 ...
- cogs 721. [SDOI2007] 线性方程组
721. [SDOI2007] 线性方程组 ★★ 输入文件:gaess.in 输出文件:gaess.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 已知 n 元 ...
- php中session原理及安全性问题
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制 我们先简单的了解一些http的知识,从而理解该协议 ...
- 高质量C++/C编程指南(林锐)
推荐-高质量C++/C编程指南(林锐) 版本/状态 作者 参与者 起止日期 备注 V 0.9 草稿文件 林锐 2001-7-1至 2001-7-18 林锐起草 V 1.0 正式文件 林锐 20 ...
- session 安全相关
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制.我们先简单的了解一些http的知识,从而理解该协议的无 ...
- 高质量C++[转]
高质量C++/C编程指南 文件状态 [ ] 草稿文件 [√] 正式文件 [ ] 更改正式文件 文件标识: 当前版本: 1.0 作 者: 林锐 博士 完成日期: 2001年7月24日 版 本 ...
- php中session机制的详解
[补充]session_start()要放在php最前面,header()函数也要放在session_start()之后. [读了下面的文章转载的文章后自己的理解]: 1,通过phpinfo()函数可 ...
- 随笔 高质量 C++/C 编程指南
内存分配方式有三种:) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量, static 变量.) 在栈上创建.在执行函数时,函数内局部变量的存储 ...
随机推荐
- PAT 甲级 1020 Tree Traversals (二叉树遍历)
1020. Tree Traversals (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...
- Spark源码分析 – DAGScheduler
DAGScheduler的架构其实非常简单, 1. eventQueue, 所有需要DAGScheduler处理的事情都需要往eventQueue中发送event 2. eventLoop Threa ...
- Mysql 多主一从数据备份
Mysql 多主一从数据备份 概述 对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库中的数据一致. 这样做有如下几点好处: 可以做灾备,其中一个坏了可以切换到另一个. 可以做负载均 ...
- 剑指Offer——按之字形顺序打印二叉树
题目描述: 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 分析: 我们都知道二叉树的层次遍历用的是队 ...
- 安装canal
一.安装前准备 配置Mysql: [mysqld] log-bin=mysql-bin #添加这一行就ok binlog-format=ROW #选择row模式 server_id=1 #配置mysq ...
- embedded-redis在单元测试中的使用
1 背景 参考链接:https://github.com/kstyrc/embedded-redis 2 使用 2.1 引入依赖 <dependency> <groupId>c ...
- 使用paramiko执行远程linux主机命令
paramiko是python的SSH库,可用来连接远程linux主机,然后执行linux命令或者通过SFTP传输文件. 关于使用paramiko执行远程主机命令可以找到很多参考资料了,本文在此基础上 ...
- Java中树的存储结构实现
一.树 树与线性表.栈.队列等线性结构不同,树是一种非线性结构. 一棵树只有一个根节点,如果一棵树有了多个根节点,那它已经不再是一棵树了,而是多棵树的集合,也被称为森林. 二.树的父节点表示法 树中除 ...
- 机器学习第5周--炼数成金-----决策树,组合提升算法,bagging和adaboost,随机森林。
决策树decision tree 什么是决策树输入:学习集输出:分类觃则(决策树) 决策树算法概述 70年代后期至80年代初期,Quinlan开发了ID3算法(迭代的二分器)Quinlan改迚了ID3 ...
- appium 中手势密码的定位坐标
原文地址http://www.cnblogs.com/smallTestKK/p/5408143.html 1.press方法中的坐标为绝对坐标,moveTO方法中的坐标都是相对坐标,具体来说第一个m ...