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]$中众数的出现次数 题解:分块,设块大小为$ ...
随机推荐
- http://www.cnblogs.com/figure9/p/developer-reading-list.html
http://www.cnblogs.com/figure9/p/developer-reading-list.html
- TP框架实现分页
TP框架自带分页的实现方法,所以使用这个分页方案,不用再重新造轮子 1,先看效果图 2,源码 /** * TODO 基础分页的相同代码封装,使前台的代码更少 * @param $m 模型,引用传递 * ...
- WF4.0 工作流设计器 传入参数问题记录?
在本公司的流程设计器 ,如果流程中使用了传入参数,应先定义 参数,然后再拖动节点,才能正确提交,否则出错,原因未查明,只观察到现象.
- linux ISO/IMG make
sudo dd if=/PATH/*.ISO of=/dev/sdb 1.制作启动U盘需要sdb,不能sdb1,否则会提示isolinux.bin文件丢失 2.TF卡,设置sdb1?忘了 /* sy ...
- Git开发备忘
1.在Git中,上传了中文命名的文件,但是后面想删除的时候,发现中文命名被转义了. 利用Git add是无法添加这类文件的,所以这里我们需要用到 git add -u命令,即可实现成功添加. 2.在G ...
- mac里git项目删除.DS_Store文件
用mac开发项目,每次提交文件时都生成修改文件的.DS_Store文件,提交时会不会觉得比较烦?别急,下面给出解决方案.我们需要用到.gitignore文件去配置Git目录中需要忽略的文件. .git ...
- Android -- 自定义权限
在android系统的安全模型中,应用程序在默认的情况下不可以执行任何对其他应用程序,系统或者用户带来负面影响的操作.如果应用需要执行某些操作,就需要声明使用这个操作对应的权限. (在manifest ...
- Alpha版本项目展示要求
Alpha版本展示的时间暂定为11月17日课上.如有变动,另行通知. 在Alpha阶段项目评审会上, 每个团队有12分钟展示时间,10分钟问答和机动时间,我们的展示也不需要PPT,大家把要展现的东西写 ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- 从零开始搭建架构实施Android项目
我们先假设一个场景需求:刚有孩子的爸爸妈妈对用照片.视频记录宝宝成长有强烈的意愿,但苦于目前没有一款专门的手机APP做这件事.A公司洞察到市场需求,要求开发团队尽快完成Android客户端的开发.以下 ...