有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c
如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。

N,M<=50000,N,M<=50000
a<=b<=N
1操作中abs(c)<=N
2操作中c<=Maxlongint


之前用树套树抄过一次...然而我并不适合写那玩意儿...

加上时间序的整体二分

普通的整体二分先处理了所有$[l,mid]$的影响因子在计算询问的答案来分组

这里要按时间序来处理影响因子和询问

可以把时间放在第一维,反正二分的时候要按权值(答案)分成两部分

然后需要区间加和区间求和,可以用树状数组

数据太坑了还要$unsigned int$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=5e5+;
typedef long long ll;
typedef unsigned int uint;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
} int n,m;
int CL;
struct BIT{
uint c[N],mark[N];
inline int lowbit(int x){return x&-x;}
inline void add(int p,int v){
for(;p<=n;p+=lowbit(p)){
if(mark[p]==CL) c[p]+=v;
else mark[p]=CL,c[p]=v;
}
}
inline uint sum(int p){
uint re=;
for(;p;p-=lowbit(p))
if(mark[p]==CL) re+=c[p];
return re;
}
inline uint que(int l,int r){
return sum(r)-sum(l-);
}
}c1,c2;
inline void add(int l,int r){
c1.add(l,);c1.add(r+,-);
c2.add(l,l);c2.add(r+,-(r+));
}
inline uint que(int l,int r){
return (r-l+)*c1.que(,l)+(r+)*c1.que(l+,r)-c2.que(l+,r);
}
struct Operation{
int op,l,r,k;
}a[N];
int id[N],t1[N],t2[N];
uint cur[N],ans[N];
void Sol(int l,int r,int ql,int qr){//printf("Sol %d %d %d %d\n",l,r,ql,qr);
if(ql>qr) return;
if(l==r){
for(int i=ql;i<=qr;i++)
if(a[id[i]].op==) ans[id[i]]=l;
return;
}
int mid=(l+r)>>,p1=,p2=;
CL++;
for(int i=ql;i<=qr;i++){
int _=i;i=id[i];
if(a[i].op==){
if(a[i].k<=mid) t1[++p1]=i;
else add(a[i].l,a[i].r),t2[++p2]=i;
}else{
uint s=cur[i]+que(a[i].l,a[i].r);
if(s<a[i].k) cur[i]=s,t1[++p1]=i;
else t2[++p2]=i;
}
i=_;
}
for(int i=;i<=p1;i++) id[ql+i-]=t1[i];
for(int i=;i<=p2;i++) id[ql+p1+i-]=t2[i];
Sol(l,mid,ql,ql+p1-);Sol(mid+,r,ql+p1,qr);
}
int main(){
freopen("in","r",stdin);
n=read();m=read();
for(int i=;i<=m;i++){
a[i].op=read(),a[i].l=read(),a[i].r=read(),a[i].k=read();
id[i]=i;
}
Sol(,n,,m);
for(int i=;i<=m;i++) if(a[i].op==) printf("%d\n",ans[i]);
}

BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]的更多相关文章

  1. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  2. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  3. BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)

    和dynamic rankings这道题的思想一样 只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的 这道题还有负数,需要离散 #include <vector> # ...

  4. BZOJ 3110 [Zjoi2013]K大数查询(整体二分)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 11654  Solved: 3505[Submit][St ...

  5. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  6. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  7. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  8. BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

    BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...

  9. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

随机推荐

  1. Spring框架学习笔记(9)——Spring对JDBC的支持

    一.使用JdbcTemplate和JdbcDaoSupport 1.配置并连接数据库 ①创建项目并添加jar包,要比之前Spring项目多添加两个jar包c3p0-0.9.1.2.jar和mysql- ...

  2. c# tolist() 浅析

    在介绍tolist()的时候我先个大家介绍一下linq的延迟加载: var products = new List<Product> { , Category = "Electr ...

  3. Java的语言特点详解

    1)简单性:java从C++简化而来,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的.java还剔除了C++操作符过载和指针操作. 2)面向对象:java是一个面向对象的语 ...

  4. CentOS、Ubuntu、Debian三个linux比较异同[转]

    Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本. 商业版本以Redhat为代表,开源社区版本则以debian为代表.这些版本各有不同的特点, ...

  5. 【问题解决】java中为什么不建议使用DataInputStream 的readLine()方法

    常用方法 int read(byte[] b) 从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中. int read(byte[] b, int off, int len) 从包含 ...

  6. Java 获得Class的绝对路径方法

    Java获得class文件的绝对路径:1.e.g. Foo.class => Foo.class.getResuorce("").getFile(); 该方法在eclipse ...

  7. MYsql优化where子句

    该部分讨论where子句的优化,不仅select之中,相同的优化同样试用与delete 和update语句中的where子句: 1: 移去不必要的括号: ((a AND b) AND c OR ((( ...

  8. 使用logrotate分割tomcat日志

    转:https://www.52os.net/articles/using-logrotate-manage-tomcat-logs.html July 28, 2014 日志是Linux系统中最重要 ...

  9. 解决跨站脚本注入,跨站伪造用户请求,sql注入等http安全漏洞

    跨站脚本就是在url上带上恶意的js关键字然后脚本注入了,跨站伪造用户请求就是没有经过登陆,用超链接或者直接url上敲地址进入系统,类似于sql注入这些都是安全漏洞. sql注入 1.参数化查询预处理 ...

  10. javabean内省

    何为JavaBean? JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一致性设计模式的公共 ...