思路:线段树套可持久化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. oracle starup报错

    今天在linux里面安装Oracle的时候出现一个报错,忽略报错安装之后,数据库启动的时候报错: 从网上找到的解决方法: 创建实例后,进入sqlplus启动报错: sqlplus / as sysdb ...

  2. android获取sdk更新

    http://www.th7.cn/Program/Android/201310/154981.shtml 网上许多解决 Android SDK Manager 无法更新(下载)的问题的方法基本都是将 ...

  3. Flume Channel

    http://blog.csdn.net/john_f_lau/article/details/20913831 http://dev.cmcm.com/archives/194

  4. hdu 3461 Code Lock

    http://acm.hdu.edu.cn/showproblem.php?pid=3461 并差集和幂取模 这道题主要是求不可操作区间. #include <cstdio> #inclu ...

  5. Win8.1专业版、核心板和企业版有什么区别

    Win8.1核心版(一般就称之为Windows 8.1) + Win8.1 专业版(称之为Windows 8.1 Pro),根据用户输入的序列号(就是Win8密钥)来区分安装.Win8.1企业版(称之 ...

  6. C51函数的递归调用

    前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...

  7. 错误:指定的任务可执行文件位置 D:\Android\platform-tools\aapt.exe 无效

    android-apt-compiler: Cannot run program "D:\android-sdk\platform-tools\aapt 装上IntelliJ IDEA /下 ...

  8. 查看登录用户who

    几个命令:wwho每隔5秒钟,就来查看hadoop是否已经登录,如登录,显示其已经登录,并退出:sleep whoami last,显示/var/log/wtmp文件,显示用户登录历史及系统重启历史  ...

  9. KafkaOffsetMonitor监控

    介绍 KafkaOffsetMonitor是有由Kafka开源社区提供的一款Web管理界面,这个应用程序用来实时监控Kafka服务的Consumer以及它们所在的Partition中的Offset,你 ...

  10. AJAX实现google搜索建议实战

    搜索建议实战的目标是为了输入搜索内容,动态的进行匹配,效果图如下: 整体思路: 在客户端搜索框中触发onkeyup事件, 随时向PHP服务器请求当前输入框中的内容, PHP服务器获取到keywords ...