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 变量.) 在栈上创建.在执行函数时,函数内局部变量的存储 ...
随机推荐
- 170405、java版MD5工具类
package com.rick.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmExce ...
- Centos6.5升级openssh至7.4版本
一,备份配置文件,以备升级失败进行回退 二,下载安装包 wget http://www.zlib.net/zlib-1.2.11.tar.gz wget https://openbsd.mirror. ...
- python - while语句/pass/死循环/break/continue/while...else...
程序开发的原则: 写重复代码 是可耻的行为: 1.while 条件: 执行代码... #循环打印0-100count = 0 while count <= 100: print("lo ...
- Java 之NIO
1. NIO 简介 Java NIO(New IO)是从1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API; NIO 与原来的IO有同样的作用和目的,但是使用的方式完全不同 ...
- golang环境安装
到官方https://golang.org/dl/下载安装包 cd /usr/local/src wget https://storage.googleapis.com/golang/go1.8.li ...
- python重建二叉树
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None ...
- mysql删除重复数据,保留最新的那一条
因为数据库没键外键,在关联查询的时候,会碰到查询条数多余数据库实际条数,这因为关联字段在表中有重复值而导致的. 解决方案: 1.数据库脚本删除重复数据,保留最新的一条 2.对关联字段增加唯一约束 例如 ...
- C#线程池ThreadPool
线程池可以看做容纳线程的容器: 一个应用程序最多只能有一个线程池: 设置线程数量ThreadPool.SetMaxThreads(initDownCardThreadPool, maxDownCard ...
- matlab手写神经网络实现识别手写数字
实验说明 一直想自己写一个神经网络来实现手写数字的识别,而不是套用别人的框架.恰巧前几天,有幸从同学那拿到5000张已经贴好标签的手写数字图片,于是我就尝试用matlab写一个网络. 实验数据:500 ...
- C# 获取计算机cpu 硬盘 网卡信息
/// <summary>/// 机器码 /// </summary> public class MachineCode { ...