思路:线段树套可持久化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的更多相关文章

  1. NOI十连测 第四测 T3

    思路: 算法一:可以n^2找出每个点的权值,然后n^2做完,预计得分10 算法二:随机找点然后每次找最高..貌似只有10分?然而考试的时候煞笔了,边界设成inf.. 算法三:随机找几个点,然后随机爬山 ...

  2. NOI十连测 第四测 T1

    思路:首先每个蚂蚁移速相同,而且碰到就转头,这其实等价于擦肩而过! 看到2n个数互不相同就觉得方便多了:枚举每个数字往左或者往右作为最慢,然后考虑其他蚂蚁有多少种走路方向. (1),走的距离大于m/2 ...

  3. <转>二十问全链路压测干货汇总(上)

    本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...

  4. 「NOI十联测」深邃

    「NOI十联测」深邃 要使得最大的连通块最小,显然先二分答案. 先固定1结点为根. 对于一个果实,显然是先处理子树中未分配的点,再向外延伸. 每个结点记录一个\(si[]\),表示子树中未分配的点数, ...

  5. 「NOI十联测」奥义商店

    「NOI十联测」奥义商店 若lzz想花费最少的钱,那么显然要选择数目较少的颜色. 先考虑暴力的写法. 每次向两边统计,每个物品要求被买的概率可以由上一个物品推出. now=1;//now 被买概率 M ...

  6. 「NOI十联测」黑暗

    「NOI十联测」黑暗 \(n\) 个点的无向图,每条边都可能存在,一个图的权值是连通块个数的 \(m\) 次方,求所有可能的图的权值和.(n≤30000,m≤15) 令\(ans[n][m]\)为n个 ...

  7. NOI十连测 第五测 T2

    思路:考虑建立可持久化线段树,第一层维护的是i这个位置的next位置,第二层,维护的是接下来走这个字符会到哪个节点. 感觉很巧妙啊,不愧是Claris #include<algorithm> ...

  8. BZOJ NOI十连测 第二测 T2

    思路:20%可以搜索.. #include<algorithm> #include<cstdio> #include<cmath> #include<cstr ...

  9. BZOJ NOI十连测 第一测 T2

    思路:看到这题,就感觉是一道很熟悉的题目: http://www.cnblogs.com/qzqzgfy/p/5535821.html 只不过这题的K最多可以到N,而且边权不再只是1,考试的时候yy了 ...

随机推荐

  1. 一种针对虚拟机的应用软件License认证方法

    由于虚拟机的硬件信息可以随意修改,使得虚拟机可能具有相同的硬件信息,在传统的应用软件License认证方式中会导致License认证漏洞.本专利提供了一种有效的解决方法. 文/王宏财 目 前,云计算的 ...

  2. poj2975--Nim

    题意:对于一个给定的取石子游戏,有多少种先手策略获胜? Ans:若无法获胜,则输出0. 若能获胜我们只要找到一堆石子,使得我们能取它的一部分让总和的异或和变为0.我们先将整个游戏的值异或起来为s 则a ...

  3. BIN和HEX文件的区别

    HEX文件和BIN文件是我们经常碰到的2种文件格式.下面简单介绍一下这2种文件格式的区别: 1.HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身.在烧写或下载HEX文件的时候,一般都不需要 ...

  4. Swap Nodes in Pairs 解答

    Question Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1 ...

  5. 决策树之ID3算法实现(python)

    决策树的概念其实不难理解,下面一张图是某女生相亲时用到的决策树: 基本上可以理解为:一堆数据,附带若干属性,每一条记录最后都有一个分类(见或者不见),然后根据每种属性可以进行划分(比如年龄是>3 ...

  6. linux环境下java读取sh脚本并执行

    Process process;           String cmd = "/home/ty/t.sh";//这里必须要给文件赋权限 chmod u+x fileName; ...

  7. Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6633311 在上一篇文章中,我 们分析了And ...

  8. Makefile 工程管理

    Makefile 工程管理 Makefile 规则 --变量 在Makefile中,用户除了可以自己定义变量外,还可以使用存在系统已经定义好的默认变量 $^:代表所有的依赖文件 $@:代表目标 $&l ...

  9. String和StringBuilder 的使用区别

    String 类有不可变性,每次执行操作时都会创建一个新的String对像,需要对该对象分配新的空间. StringBuilder 解决了对字符串重复修改过程中创建大量对象的问题.初始化一个Strin ...

  10. 前端--关于CSS盒模型

    CSS样式规则的学习是很繁琐和枯燥的,因为它不像物理.数学或者其他编程语言一样有一些基本概念.有一些基本公理或者规则,其他所有的表现都是概念在这些公里或者规则之下的逻辑游戏,CSS是有一些基本概念,但 ...