NOI2016模拟赛Zbox loves stack
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define PI pair<int,int>
#define fi first
#define se second
#define mp(a,b) make_pair(a,b)
#define maxn 1000005
#define maxk 40000005
int n,q,tot,val[maxk],fa[maxk],son[maxk][],size[maxk];
void read(int &x){
x=; int f=; char ch;
for (ch=getchar();!isdigit(ch);ch=getchar()) if (ch=='-') f=-;
for (;isdigit(ch);ch=getchar()) x=x*+ch-''; x*=f;
}
int lazy[maxn<<],root[maxn<<];
struct Treap{
int random(int x){return rand()%x+;}
void updata(int x){
size[x]=size[son[x][]]+size[son[x][]]+;
}
int newnode(int x){
size[++tot]=,val[tot]=val[x]; return tot;
}
PI split(int x,int y){
if (y==) return mp(,x);
if (size[x]==y) return mp(x,);
PI temp; int nx,ny;
if (size[son[x][]]>=y){
temp=split(son[x][],y); nx=newnode(x),son[nx][]=temp.se,son[nx][]=son[x][],updata(nx);
return mp(temp.fi,nx);
}else{
temp=split(son[x][],y-size[son[x][]]-);
nx=newnode(x),son[nx][]=temp.fi,son[nx][]=son[x][],updata(nx); return mp(nx,temp.se);
}
}
int merge(int x,int y){
int nx,ny;
if (x==||y==) return x+y;
if (random(size[x]+size[y])<=size[x]){
nx=newnode(x),son[nx][]=son[x][],son[nx][]=merge(son[x][],y),updata(nx);
return nx;
}else{
ny=newnode(y),son[ny][]=son[y][],son[ny][]=merge(x,son[y][]),updata(ny);
return ny;
}
}
void lazypush(int k,int x){
int t=min(x,size[root[k]]);
PI temp; int a,b,c;
temp=split(root[k],size[root[k]]-t);
a=temp.fi,c=temp.se;
root[k]=a; lazy[k]+=(x-t);
}
void insert(int k,int x){
int t=root[k];
int nx=++tot; val[nx]=x,size[nx]=;
root[k]=merge(root[k],nx);
}
void Query(int k,int x){
int t=root[k]; PI temp; int a,b,c;
if (size[root[k]]<x) printf("Error\n");
else{
int T=size[t]-x+;
temp=split(t,T);
a=temp.fi,c=temp.se;
temp=split(a,T-);
a=temp.fi,b=temp.se;
printf("%d\n",val[b]);
}
}
}treap;
struct Segment{
void build(int k,int l,int r){
lazy[k]=;
if (l==r) return; int mid=(l+r)>>;
build(k*,l,mid),build(k*+,mid+,r);
}
void pushdown(int k,int op){
if (op==){
lazy[k]=; return;
}
if (lazy[k]>){
treap.lazypush(k*,lazy[k]);
treap.lazypush(k*+,lazy[k]);
lazy[k]=;
}
root[k*]=treap.merge(root[k*],root[k]);
root[k*+]=treap.merge(root[k*+],root[k]);
root[k]=;
}
void insert(int k,int l,int r,int x,int y,int z){
pushdown(k,(l==r));
if (l>=x&&r<=y){
treap.insert(k,z);
return;
}int mid=(l+r)>>;
if (x<=mid) insert(k*,l,mid,x,y,z);
if (y>mid) insert(k*+,mid+,r,x,y,z);
}
void Delete(int k,int l,int r,int x,int y){
pushdown(k,(l==r));
if (l>=x&&r<=y){
treap.lazypush(k,);
return;
}int mid=(l+r)>>;
if (x<=mid) Delete(k*,l,mid,x,y);
if (y>mid) Delete(k*+,mid+,r,x,y);
}
void Query(int k,int l,int r,int x,int y){
pushdown(k,(l==r));
if (l==r&&r==x){
treap.Query(k,y);
return;
}int mid=(l+r)>>;
if (x<=mid) Query(k*,l,mid,x,y);
else Query(k*+,mid+,r,x,y);
}
}Tree; int main(){
srand();
read(n),read(q);
memset(root,,sizeof(root));
memset(size,,sizeof(size));
Tree.build(,,n);
for (int type,l,r,w;q;--q){
read(type),read(l),read(r);
if (type==) read(w),Tree.insert(,,n,l,r,w);
else if (type==) Tree.Delete(,,n,l,r);
else Tree.Query(,,n,l,r);
}
return ;
}
题目大意:Zbox loves stack
题目描述
从小热爱计算机的Zbox开始玩栈了.Zbox有n个栈,他命令你支持如下操作:
*.把第l个栈到第r个栈都压入一个元素x
*.把第l个栈到第r个栈都弹出栈顶(若栈为空则无视)
*.询问第s个栈的第k个元素是多少(栈顶为第一个元素)
输入描述
第一行2个数n,q
接下来q行,每行第一个数为t
若t为0,输入l,r,x,把第l个栈到第r个栈都压入一个元素x
若t为1,输入l,r,把第l个栈到第r个栈都弹出栈顶
若t为2,输入s,k,询问第s个栈的第k个元素是多少,若栈中没有k个元素则输出"Error"
输出描述
对于每一个t=2的操作,输出一行"Error"或一个数表示答案。
做法:考场上我写了10分算法,暴力模拟,本还妄想水过满分(雾——)。今天这套题拿了120分纪念一下,不过还是因为出题人太仁道了。
本题正解:这题采用树套树的做法,线段树维护区间,对于线段树的每个节点建立一个treap,首先,这题要求维护一个高级数据结构,支持在该数据结构添加一个节点,删除一个节点,询问第k个位置,这是平衡树能轻松做到的,但是这是区间修改,显然要用到线段树维护,那么怎么下传信息呢,如果要下传x节点的信息,设其两个儿子分别为t1,t2,我们需要做的就是把x与t1,t2分别合并,但是x和其中一个合并后会破坏x的信息,所以我们要将可持久化,我便考虑用线段树套可持久化treap。还有一个细节就是:删除操作,若节点的个数不够,我们打上标记,下传信息时,应先下传标记,再下传之前说的信息。
线段树+可持久化treap。
NOI2016模拟赛Zbox loves stack的更多相关文章
- [Ynoi2019模拟赛]Yuno loves sqrt technology I
		题目描述 给你一个长为n的排列,m次询问,每次查询一个区间的逆序对数,强制在线. 题解 MD不卡了..TMD一点都卡不动. 强制在线的话也没啥好一点的方法,只能分块预处理了. 对于每个块,我们设lef ... 
- [Ynoi2019模拟赛]Yuno loves sqrt technology III
		题目大意: 给你一个长为n的序列a,m次询问,每次查询一个区间的众数的出现次数,强制在线. 解题思路: 出题人题解 众所周知lxl是个毒瘤,Ynoi道道都是神仙题 首先得离散化. 分块后,预处理Fi, ... 
- [Ynoi2019模拟赛]Yuno loves sqrt technology II(二次离线莫队)
		二次离线莫队. 终于懂了 \(lxl\) 大爷发明的二次离线莫队,\(\%\%\%lxl\) 二次离线莫队,顾名思义就是将莫队离线两次.那怎么离线两次呢? 每当我们将 \([l,r]\) 移动右端点到 ... 
- [Luogu5048] [Ynoi2019模拟赛]Yuno loves sqrt technology III[分块]
		题意 长为 \(n\) 的序列,询问区间众数,强制在线. \(n\leq 5\times 10^5\). 分析 考虑分块,暴力统计出整块到整块之间的众数次数. 然后答案还可能出现在两边的两个独立的块中 ... 
- 省选模拟赛 LYK loves rabbits(rabbits)
		题目描述 LYK喜欢兔子,它在家中养了3只兔子. 有一天,兔子不堪寂寞玩起了游戏,3只兔子排成一排,分别站在a,b,c这3个位置. 游戏的规则是这样的,重复以下步骤k次:选择两个不同的兔子A和B,假如 ... 
- 省选模拟赛 LYK loves graph(graph)
		题目描述 LYK喜欢花花绿绿的图片,有一天它得到了一张彩色图片,这张图片可以看做是一张n*m的网格图,每个格子都有一种颜色去染着,我们用-1至n*m-1来表示一个格子的颜色.特别地,-1代表这个颜色是 ... 
- 省选模拟赛 LYK loves string(string)
		题目描述 LYK喜欢字符串,它认为一个长度为n的字符串一定会有n*(n+1)/2个子串,但是这些子串是不一定全部都不同的,也就是说,不相同的子串可能没有那么多个.LYK认为,两个字符串不同当且仅当它们 ... 
- [luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III
		题目链接 洛谷. Solution 思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作. 首先还是预处理\(f[l][r]\)表示\(l\sim ... 
- [洛谷P5048][Ynoi2019模拟赛]Yuno loves sqrt technology III
		题目大意:有$n(n\leqslant5\times10^5)$个数,$m(m\leqslant5\times10^5)$个询问,每个询问问区间$[l,r]$中众数的出现次数 题解:分块,设块大小为$ ... 
随机推荐
- QT 文件操作
			QT提供了QFile类用于文件读写 QFile可以读写文本文件,也可以读写二进制文件 #include "widget.h" #include <QGridLayout> ... 
- 小图标外链API
			网页上有些分享的小图标,比如分享到facebook,weibo,qq空间等功能的时候,图标以前一般是自己做一个css sprite.当一个网站的图标变了的时候,比如facebook变成assbook的 ... 
- 翻译qmake文档(四) Building Common Project Types
			翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型 本章描述 ... 
- 45个JavaScript小技巧
			原文地址 http://modernweb.com/2013/12/23/45-useful-javascript-tips-tricks-and-best-practices/ 这篇文章的质量个人感 ... 
- SQLServer(MSSQL)、MySQL、SQLite、Access相互迁移转换工具 DB2DB v1.3
			最近公司有一个项目,需要把原来的系统从 MSSQL 升迁到阿里云RDS(MySQL)上面.为便于测试,所以需要把原来系统的所有数据表以及测试数据转换到 MySQL 上面.在百度上找了很多方法,有通过微 ... 
- 支持向量机通俗导论(理解SVM的三层境界)
			原文链接:http://blog.csdn.net/v_july_v/article/details/7624837 作者:July.pluskid :致谢:白石.JerryLead 出处:结构之法算 ... 
- hihocoder 1260
			之前做过的oj, acm题目忘了很多了, 又要开始要刷题了, go on! #1260 : String Problem I 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描 ... 
- centos7.2安装phpmyadmin
			首先服务器要有web 环境 yum install phpmyadmin 修改/etc/http.conf/conf.d/phpMyadmin.conf 将 #Require ip 127.0.0. ... 
- Linux终端更改提示符
			打开~/.bashrc可以看到命令提示的内容为:\u@\h\w\$ \u表示用户名,\h表示主机名,\w表示当前目录,\$表示命令提示符(普通用户$,超级用户#) 这个命令提示符有点长,很碍事,\u@ ... 
- 由Nullable模式想到的ToString的扩展
			虽然关于null的一切争论永不停息,但根据实际开发经历,很多时候需要判断无聊的null,并且有些的判断是可有可无的,尤其是在表现层. string e = null; if (e != null) { ... 
