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]$中众数的出现次数 题解:分块,设块大小为$ ...
随机推荐
- netcore web.config ConnectionStrings AppSettings
new ConfigurationBuilder().Build().GetSection("ConnectionStrings") new ConfigurationBuilde ...
- php数组函数,字符串,linux命令
1>> Linux常用命令一. 文件目录操作命令1. ls命令 命令格式:ls [选项] [目录名] 命令功能:列出目标目录中所有的子目录和文件.2. 命令格式:cd [目录名 ...
- Spring MVC 前后端 Json 方式交互和处理
众所周知,在mvc中,数据是在各个层次之间进行流转是一个不争的事实. 而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的. 数据在页面上是一个扁平的,不带数据类 ...
- .NET程序迁移到Mysql的极简方案——让GGTalk同时支持Sqlserver与mysql全程记录!
园子里的这个GGTalk,咱们前前后后用它移花接木做的IM项目也不下三四个了.初次入手的时候,洋洋代码,多少感觉有些难以把握.不过一来二去,理清了头绪,也就一览无余了.相信跟我们一样想要利用GGTal ...
- HTML5+JS 《五子飞》游戏实现(三)页面和棋盘棋子
前面两节,我们已经对<五子飞>有个初步的认识,对走棋路线也有了基本的了解,现在里沃特继续跟大家分享HTML页面,另外把棋盘棋子也画出来. 演示地址:http://www.lyout.com ...
- 用 canvas 做个好玩的网站背景
不知不觉又好久没更过博客了,老调新弹一下,之前做的一个小效果,觉得蛮有意思的,也有朋友问是怎么做的,就分享一下,写个博文吧. 先上demo吧:http://whxaxes.github.io/canv ...
- background-size对background-position的影响
CSS3中提出了background-size属性,该属性可以设置背景图片的大小,该属性的值设置为绝对数值或者百分比时对background-position没有任何影响,当设置为contain/co ...
- HFS汉化版|简易HTTP服务器
专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,只要解压缩后执 ...
- Jquery Mobile中pageinit等函数执行两次的问题【终极解决】
当禁用了jqueryMobile的ajax后,初始化函数如pageinit和pageshow等函数,都会执行两次.document.ready函数也会执行两次. 当然我们可以用一个变量记录是否已经执行 ...
- 使用Servlet实现下载文件的功能
在前台有一个下载链接,比如 <a href="DownLoadServlet">下载</a> <br/> 使用Servlet实现下载: impo ...