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]$中众数的出现次数 题解:分块,设块大小为$ ...
随机推荐
- 监听grid行点击事件
- handlebars+require
handlebars+require 最近在某网站看到了handlebars.js,出于好奇就百度了下这是神马玩意,结果让我很是欢喜,于是就开始自学下,handlebars就几个方法,蛮简单,言归正传 ...
- vbs http
get请求 模拟发送http请求到百度Dim httpSet http = CreateObject("Msxml2.ServerXMLHTTP")http.open " ...
- python网络编程学习《一》
最近,刚实习完,很喜欢实验楼,但是自己的方向仍然不能确定,自己觉得可选择的空间很大,尽管已经是大四的人了,想到别人都在忙着买职业装,买高跟鞋面试,学习化妆什么的,看看自己,反而开始慢慢关注运动,食疗以 ...
- Theano2.1.1-基础知识之准备工作
来源:http://deeplearning.net/software/theano/tutorial/index.html#tutorial 这里介绍的是使用theano的一些基础知识,虽然thea ...
- GridView的 OnRowDataBound 事件用法
<asp:GridView ID="RptUsers" runat="server" AutoGenerateColumns="False&qu ...
- [c++]printf的编译器静态检测
经常会用到C的格式化字符串,gcc/clang的扩展,都是可以进行字符串和可变参数的检测,不匹配,就会爆warning. 自己手写的,需要加上一点代码,否则不会进行检测. 1. 可变参数 void ...
- background-position 50% 50%是如何计算的
background-position:value1 value2 value1和value2的值可以值绝对值也可以是百分数,大部分值都很好理解,但是50% 50%这两个值是如何计算的呢? 图片水平和 ...
- jq mobile非ajax加载,ready执行两次
jqm只有通过ajax加载的页面才只执行一次ready(正常情况) 页面刷新(同非ajax加载的页面)都会执行两次ready,包括pageinit和pageshow事件也是如此. 两种避免的方法是: ...
- android 调用电话功能
今天用到了打电话的功能,这要如何实现呢? 很简单 1.创建对应对的xml展示页面喝java文件 2.在manifest中添加权限 下面上代码吧: 这是布局的一部分 <LinearLayout a ...