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]$中众数的出现次数 题解:分块,设块大小为$ ...
随机推荐
- 001淘淘商城项目:项目的Maven工程搭建
开始一个新的项目,特此记录,资料全部来源于传智播客,感谢. 我们要做一个类似电商的项目.用maven做管理. maven里面主要分为三种工程: 1:pom工程:用在父级工程,聚合工程中 2:war工程 ...
- DLL放在指定目录 以及设置dll调用路径
一.DLL放在指定目录 在编写C# winform程序中,不免一个项目会有多个工程文件,而这些工程文件之间是相互引用的,所以不想将工程的生成结果(exe或者dll)放在当前工程bin目录下的Debug ...
- QT 网络编程三(TCP版)
QT客户端 //widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpSocket& ...
- Tomcat 内存溢出对应解决方式
1.Tomcat内存溢出的原因 生产环境中Tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三 ...
- PRML读书会第十二章 Continuous Latent Variables(PCA,Principal Component Analysis,PPCA,核PCA,Autoencoder,非线性流形)
主讲人 戴玮 (新浪微博: @戴玮_CASIA) Wilbur_中博(1954123) 20:00:49 我今天讲PRML的第十二章,连续隐变量.既然有连续隐变量,一定也有离散隐变量,那么离散隐变量是 ...
- centos hadoop搭建准备
永久修改主机名:hostnamectl set-hostname <hostname> IP地址: BOOTPROTO=static IPADDR=192.168.31.128NETMAS ...
- Scala入门之函数进阶
/** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式是匿名函数,定义的时候只需要说明输入参数的类型和函数体即可,不需要 ...
- 绝对干货:供个人开发者赚钱免费使用的一些好的API接口
不久前,我写了一篇文章,名为<科普技术贴:个人开发者的那些赚钱方式>,讲了一些个人开发者接私活和自己做软件加广告的一些科普知识.可是做软件,需要服务器,需要后台,对于一些小的开发者,想赚点 ...
- Web Audio API 实现音频可视化
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢! 一转眼就已经有三个月没写博客了,毕业季事情确实多,现在也终于完全毕业了,博客还是不能落下.偶尔还是要写一下. 玩HTML5的Audio A ...
- java中的全等和相似
package pack2; import java.util.*; /*Node 的equals()和hashCode()两个函数缺一不可 * HashSet会通过这两个函数来判断两个元素是否等价 ...