P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)
权值线段树套区间线段树
把插入的值离散化一下开个线段树
蓝后每个节点开个线段树,维护一下每个数出现的区间和次数
为了防止MLE动态开点就好辣
重点是标记永久化,就是不下传标记,而是每次询问时算上路径上的标记
标记永久化后快了1倍
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rint register int
using namespace std;
typedef long long ll;
inline int Min(int a,int b){return a<b?a:b;}
inline int Max(int a,int b){return a>b?a:b;}
void gi(int &x){
static char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
void gll(ll &x){
static char c=getchar();x=; bool f=;
while(c<''||c>'') f=f&&(c!='-'),c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
x=f?x:-x;
}
#define N 50005
#define W 20000005
int n,m,u,tn,opt[N],L[N],R[N],b[N],rt[],lc[W],rc[W],add[W];
ll k[N],sum[W];
#define mid (l+r)/2
void Add(int &o,int l,int r,int x1,int x2){
if(!o) o=++u;
sum[o]+=Max(Min(x2,r)-Max(x1,l)+,);//遍历过程中先处理掉sum
if(x1<=l&&r<=x2){++add[o]; return ;}//标记永久化
if(x1<=mid) Add(lc[o],l,mid,x1,x2);
if(x2>mid) Add(rc[o],mid+,r,x1,x2);
}
ll Ask(int o,int l,int r,int x1,int x2,ll t){
if(!o) return t*Max(Min(x2,r)-Max(x1,l)+,);//注意不返回0
if(x1<=l&&r<=x2) return sum[o]+t*(r-l+);
ll re=;
if(x1<=mid) re+=Ask(lc[o],l,mid,x1,x2,t+add[o]);//累加路径上的标记
if(x2>mid) re+=Ask(rc[o],mid+,r,x1,x2,t+add[o]);
return re;
}
void ins(int o,int l,int r,int x1,int x2,int v){
Add(rt[o],,n,x1,x2);
if(l==r) return ;
if(v<=mid) ins(o<<,l,mid,x1,x2,v);
else ins(o<<|,mid+,r,x1,x2,v);
}
int ask(int o,int l,int r,int x1,int x2,ll v){
if(l==r) return b[l];
ll tmp=Ask(rt[o<<|],,n,x1,x2,);
if(v<=tmp) return ask(o<<|,mid+,r,x1,x2,v);
else return ask(o<<,l,mid,x1,x2,v-tmp);
}
int main(){
gi(n);gi(m);
for(rint i=;i<=m;++i){
gi(opt[i]);gi(L[i]);gi(R[i]);gll(k[i]);
if(opt[i]==) b[++tn]=k[i];
}sort(b+,b+tn+);
tn=unique(b+,b+tn+)-b-;//离散化
for(rint i=;i<=m;++i)
if(opt[i]==) k[i]=lower_bound(b+,b+tn+,k[i])-b;
for(rint i=;i<=m;++i){
if(opt[i]==) ins(,,tn,L[i],R[i],k[i]);
else printf("%d\n",ask(,,tn,L[i],R[i],k[i]));
}return ;
}
P3332 [ZJOI2013]K大数查询(线段树套线段树+标记永久化)的更多相关文章
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- 洛谷 P3332 [ZJOI2013]K大数查询 (整体二分理解)
链接: P3332 题意: 维护 \(n(1\leq n\leq 5\times10^4)\) 个可重整数集,编号从 \(1\) 到 \(n\).有 \(m(1\leq m\leq5\times10^ ...
- P3332 [ZJOI2013]K大数查询
传送门 注意操作 $1$ 是在区间的每个位置加入一个数,不是加上一个值 相当于每个位置维护的是一个集合 显然树套树 一开始想的是区间线段树套权值线段树 发现这样询问区间第 $K$ 大时就要先二分答案再 ...
- [洛谷P3332][ZJOI2013]K大数查询
题目大意:有$n$个位置,$m$个操作.操作有两种: $1\;l\;r\;x:$在区间$[l,r]$每个位置加上一个数$x$ $2\;l\;r\;k:$询问$[l,r]$中第$k$大的数是多少. 题解 ...
- 洛谷 P3332 [ZJOI2013]K大数查询 || bzoj3110
用树套树就很麻烦,用整体二分就成了裸题.... 错误: 1.尝试线段树套平衡树,码农,而且n*log^3(n)慢慢卡反正我觉得卡不过去 2.线段树pushdown写错...加法tag对于区间和的更新应 ...
- 洛谷P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树_标记永久化
Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...
- P3332 [ZJOI2013]K大数查询 整体二分
终于入门整体二分了,勉勉强强算是搞懂了一个题目吧. 整体二分很多时候可以比较好的离线处理区间\(K\)大值的相关问题.考虑算法流程: 操作队列\(arr\),其中有询问和修改两类操作. 每次在答案的可 ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 418 Solved: 235 [ Submit][ ...
随机推荐
- Java学习路径及练手项目合集
Java 在编程语言排行榜中一直位列前排,可知 Java 语言的受欢迎程度了. 实验楼上的[Java 学习路径]中将首先完成 Java基础.JDK.JDBC.正则表达式等基础实验,然后进阶到 J2SE ...
- crontab-rsync
写一个shell脚本放到crontab中,该脚本利用rsync把远程同步到本地的话,需要把本地的公钥放到远程的authorized_keys:否则,手动执行脚本没问题,但是crontab执行就不会有效 ...
- nginx 长连接keeplive
发现后台日志打印太多 FD打开太多的日志. 处理思路: 修改nginx upstream的长连接 http://blog.csdn.net/gzh0222/article/details/852363 ...
- Hotfix
http://group.jobbole.com/6311/ http://www.jianshu.com/p/6f0ae1e364d9 http://www.mamicode.com/info-de ...
- Message对象
一)描述 1: 每一个Message对象都包含两个对象: (1)google::protobuf::Descriptor 描述对象,是Message所有Filed的一个集合,它又包含了FieldDes ...
- Mysql事务及锁
一.事务(Transaction)及其ACID属性 事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性:1.原子性(Atomicity):事务是一个原子操作单 ...
- 获取MyBatis
点击:获取MyBatis https://github.com/mybatis/mybatis-3/releases 点击:进入中文MyBatis的说明文档 http://www.mybatis.or ...
- Python - 1. Built-in Atomic Data Types
From:http://interactivepython.org/courselib/static/pythonds/Introduction/GettingStartedwithData.html ...
- session_start 统计实时访客人数
void Session_Start(object sender, EventArgs e) { Application.Lock(); Application["OnLine"] ...
- Linux QtCreator 编译报错:No rule to make target '.../***' needed by '***.o'.stop
Linux QtCreator 编译报错:No rule to make target 'mainwindow.cpp' needed by 'mainwindow.o'.stop [1]解决方案 ...