NOI十连测 第四测 T2



思路:线段树套可持久化treap,可持久化treap我还是第一次听说。。
改题的时候没看数据范围。。乱开数组T_T
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<time.h>
#include<bits/stdc++.h>
#include<ext/rope>
using namespace std;
using namespace __gnu_cxx;
int n;
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
struct treaps{
int ch[][],rnd[],size[],num[],tt;
int newnode(int s=){
if (tt>) assert();
++tt;
ch[tt][]=ch[s][];
ch[tt][]=ch[s][];
if (s) rnd[tt]=rnd[s];else rnd[tt]=rand();
size[tt]=size[s];
num[tt]=num[s];
return tt;
}
void updata(int k){
size[k]=+size[ch[k][]]+size[ch[k][]];
}
int getsize(int k){
return size[k];
}
int merge(int s,int t){
if (!s||!t) return s+t;
if (rnd[s]>rnd[t]){
int d=newnode(s);
ch[d][]=merge(ch[d][],t);
updata(d);
return d;
}else{
int d=newnode(t);
ch[d][]=merge(s,ch[d][]);
updata(d);
return d;
}
}
pair<int,int> split(int s,int k){
if (!s) return make_pair(,);
if (size[ch[s][]]>=k){
pair<int,int> ls=split(ch[s][],k);
int d=newnode(s);
ch[d][]=ls.second;updata(d);
return pair<int,int>(ls.first,d);
}
pair<int,int> ls=split(ch[s][],k-size[ch[s][]]-);
int d=newnode(s);
ch[d][]=ls.first;updata(d);
return pair<int,int>(d,ls.second);
}
void clear(int &s){
s=;
}
void push_back(int &s,int w){
int d=newnode();size[d]=;num[d]=w;
s=merge(s,d);
}
void pop_back(int &s){
s=split(s,size[s]-).first;
}
int findkth(int s,int k){
if (size[ch[s][]]>=k) return findkth(ch[s][],k);
if (size[ch[s][]]+==k) return num[s];
return findkth(ch[s][],k-size[ch[s][]]-);
}
}treap;
struct segment{
int tt,l[],r[];
int ins[];
int erz[];
int build(int ql=,int qr=n){
int t=++tt;
int mid=(ql+qr)>>;
if (ql==qr) return t;
l[t]=build(ql,mid);
r[t]=build(mid+,qr);
return t;
}
void pushdown(int root){
if (erz[root]){
if (treap.getsize(ins[l[root]])<=erz[root]){
erz[l[root]]+=erz[root]-treap.getsize(ins[l[root]]);
treap.clear(ins[l[root]]);
}else ins[l[root]]=treap.split(ins[l[root]],treap.getsize(ins[l[root]])-erz[root]).first; if (treap.getsize(ins[r[root]])<=erz[root]){
erz[r[root]]+=erz[root]-treap.getsize(ins[r[root]]);
treap.clear(ins[r[root]]);
}else ins[r[root]]=treap.split(ins[r[root]],treap.getsize(ins[r[root]])-erz[root]).first;
erz[root]=;
}
if (treap.getsize(ins[root])){
ins[l[root]]=treap.merge(ins[l[root]],ins[root]);
ins[r[root]]=treap.merge(ins[r[root]],ins[root]);
treap.clear(ins[root]);
}
}
void push(int root,int ql,int qr,int w,int pl=,int pr=n){
if ((ql==pl)&&(pr==qr)){
treap.push_back(ins[root],w);
return;
}
pushdown(root);
int mid=(pl+pr)>>;
if (ql<=mid) push(l[root],ql,min(qr,mid),w,pl,mid);
if (qr>mid) push(r[root],max(mid+,ql),qr,w,mid+,pr);
}
void pop(int root,int ql,int qr,int pl=,int pr=n){
if ((ql==pl)&&(qr==pr)){
if (treap.getsize(ins[root])) treap.pop_back(ins[root]);
else erz[root]++;
return;
}
pushdown(root);
int mid=(pl+pr)>>;
if (ql<=mid) pop(l[root],ql,min(mid,qr),pl,mid);
if (qr>mid) pop(r[root],max(ql,mid+),qr,mid+,pr);
}
void work(int root,int s,int k,int pl=,int pr=n){
if (pl==pr){
if (treap.getsize(ins[root])<k) printf("Error\n");
else
printf("%d\n",treap.findkth(ins[root],treap.getsize(ins[root])-k+));
return;
}
pushdown(root);
int mid=(pl+pr)>>;
if (s<=mid) work(l[root],s,k,pl,mid);
else work(r[root],s,k,mid+,pr);
}
}seg;
int main(){
n=read();int q=read();
seg.build();
while (q--){
int opt=read();
if (opt==){
int l=read(),r=read(),x=read();
seg.push(,l,r,x);
}else
if (opt==){
int l=read(),r=read();
seg.pop(,l,r);
}else
if (opt==)
{
int s=read(),k=read();
seg.work(,s,k);
}
}
}
NOI十连测 第四测 T2的更多相关文章
- NOI十连测 第四测 T3
思路: 算法一:可以n^2找出每个点的权值,然后n^2做完,预计得分10 算法二:随机找点然后每次找最高..貌似只有10分?然而考试的时候煞笔了,边界设成inf.. 算法三:随机找几个点,然后随机爬山 ...
- NOI十连测 第四测 T1
思路:首先每个蚂蚁移速相同,而且碰到就转头,这其实等价于擦肩而过! 看到2n个数互不相同就觉得方便多了:枚举每个数字往左或者往右作为最慢,然后考虑其他蚂蚁有多少种走路方向. (1),走的距离大于m/2 ...
- <转>二十问全链路压测干货汇总(上)
本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...
- 「NOI十联测」深邃
「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...
- 「NOI十联测」奥义商店
「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...
- 「NOI十联测」黑暗
「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...
- NOI十连测 第五测 T2
思路:考虑建立可持久化线段树,第一层维护的是i这个位置的next位置,第二层,维护的是接下来走这个字符会到哪个节点. 感觉很巧妙啊,不愧是Claris #include<algorithm> ...
- BZOJ NOI十连测 第二测 T2
思路:20%可以搜索.. #include<algorithm> #include<cstdio> #include<cmath> #include<cstr ...
- BZOJ NOI十连测 第一测 T2
思路:看到这题,就感觉是一道很熟悉的题目: http://www.cnblogs.com/qzqzgfy/p/5535821.html 只不过这题的K最多可以到N,而且边权不再只是1,考试的时候yy了 ...
随机推荐
- Oracle主键约束、唯一键约束、唯一索引的区别
一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的.索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念.键代表创建来实施业务规则的完整性约束.索引和键的混淆通常是由于数据库使用索 ...
- Find out C++ Memory Usage in Code
You can use Microsoft Platform SDK functions to get the heap size at a specific point. If get the he ...
- WinDriver的一些
http://blog.csdn.net/chuajiang/article/details/2115508
- idea
一. 常用快捷键 搜索class Ctrl+N 搜索文件 Ctrl+Alt+N 当前窗口查找/全工程查找 Ctrl+F/Ctrl+Shift+F,F3/Shift+F3前后移动 上/下一个位置 Ctr ...
- php将会话保存在数据库里
php默认把会话保存在临时文件中,保存在数据库中可以提高安全性,在共享主机服务器上,所有web站点都使用同一个临时目录,这意味着数十个程序都在同一位置进行文件读取的操作,我们很容易就编写一个脚本从这个 ...
- (\S)? 匹配0个或者一个前导字符
---------------------------------------------- "1" 模式: \"(?<id>(\S+)?)\" ? ...
- 【转】android4.1.2 CTS测试总结
原文网址:http://blog.csdn.net/bboyliaoye/article/details/17299259 公司客户的产品要过google GMS认证,首先要过的就是兼容性测试(CTS ...
- tcpdump详细用法
1.1 三种关键字 关于类型的关键字 第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,n ...
- CF 584B Kolya and Tanya
题目大意:3n个人围着一张桌子,给每个人发钱,可以使1块.2块.3块,第i个人的金额为Ai.若存在第个人使得Ai + Ai+n + Ai+2n != 6,则该分配方案满足条件,求所有的满足条件的方案数 ...
- Subversion安装
一.Subversion介绍 Subversion是一个集中式的信息共享系统.版本库是Subversion的核心部分,是数据的中央仓库.版本库以典型的文件和目录结构形式文件系统树来保存信息.任意数量的 ...