+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

http://www.lydsy.com/JudgeOnline/problem.php?id=3110

Description

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

Input

第一行N,M
接下来M行,每行形如1 a b c或2 a b c

Output

输出每个询问的结果

Sample Input

2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3

Sample Output

1
2
1

整体二分板子题,具体题解百度去吧,2333333……

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=;
inline ll read(){
ll X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int op[N],a[N],b[N],pos[N],ans[N];
ll c[N],tree[][N];
int n,m,tot;
int tmp1[N],tmp2[N];
inline int lowbit(int t){return t&(-t);}
void clear(int k,int x){
for(int i=x;i<=tot;i+=lowbit(i))tree[k][i]=;
}
void add(int k,int x,ll y){//将a[x]+y
for(int i=x;i<=tot;i+=lowbit(i))tree[k][i]+=y;
}
void modify(ll x,ll y,ll z){
add(,x,z);add(,x,z*(x-));add(,y+,-z);add(,y+,-z*y);
}
ll query(int k,int x){//1-x区间和
ll res=;
for(int i=x;i>;i-=lowbit(i))res+=tree[k][i];
return res;
}
ll qry(ll x,ll y){
return query(,y)*y-query(,y)-query(,x-)*(x-)+query(,x-);
}
void solve(int L,int R,int l,int r){
if(L>R)return;
if(l==r){
for(int i=L;i<=R;i++){
if(op[pos[i]]==)ans[pos[i]]=l;
}
return;
}
int idx1=,idx2=,mid=(l+r)>>;
for(int i=L;i<=R;i++){
if(op[pos[i]]==){
if((int)c[pos[i]]<=mid){
modify(a[pos[i]],b[pos[i]],);
tmp1[idx1++]=pos[i];
}else tmp2[idx2++]=pos[i];
}else{
ll tmp=qry(a[pos[i]],b[pos[i]]);
if(tmp<c[pos[i]]){
tmp2[idx2++]=pos[i];
c[pos[i]]-=tmp;
}
else tmp1[idx1++]=pos[i];
}
}
for(int i=;i<idx1;i++){
int k=tmp1[i];
clear(,a[k]);clear(,a[k]);
clear(,b[k]+);clear(,b[k]+);
}
int MID=L+idx1;
for(int i=L;i<MID;i++)pos[i]=tmp1[i-L];
for(int i=MID;i<=R;i++)pos[i]=tmp2[i-MID];
solve(L,MID-,l,mid);solve(MID,R,mid+,r);
return;
}
int main(){
n=read(),m=read();
for(int i=;i<=m;i++){
op[i]=read();
a[i]=read();b[i]=read();c[i]=read();
if(op[i]==){c[i]=(ll)n-c[i]+;tot=max(tot,(int)c[i]);}
pos[i]=i;
}
solve(,m,,tot);
for(int i=;i<=m;i++){
if(op[i]==)printf("%d\n",n-ans[i]+);
}
return ;
}

BZOJ3110:[ZJOI2013]K大数查询——题解的更多相关文章

  1. BZOJ3110[Zjoi2013]K大数查询(树状数组+整体二分)

    3110 [Zjoi2013]K大数查询 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a ...

  2. BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...

  3. bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  4. BZOJ3110: [Zjoi2013]K大数查询

    喜闻乐见的简单树套树= =第一维按权值建树状数组,第二维按下标建动态开点线段树,修改相当于第二维区间加,查询在树状数组上二分,比一般的线段树还短= =可惜并不能跑过整体二分= =另外bzoj上的数据有 ...

  5. [BZOJ3110][ZJOI2013]K大数查询(整体二分)

    BZOJ Luogu sol 整体二分,其实很简单的啦. 对所有询问二分一个答案mid,把所有修改操作中数字大于mid的做一个区间覆盖(区间加1) 查询就是区间查询 然后左右分一分即可 注意是第k大 ...

  6. BZOJ3110:[ZJOI2013]K大数查询(整体二分)

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

  7. BZOJ3110[Zjoi2013]K大数查询——权值线段树套线段树

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

  8. 【树套树】bzoj3110 [Zjoi2013]K大数查询

    题解很多,实现起来以外地简洁.内层的区间线段树上用了标记永久化. #include<cstdio> using namespace std; #define N 50001 struct ...

  9. bzoj3110 [Zjoi2013]K大数查询——线段树套线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3110 外层权值线段树套内层区间线段树: 之所以外层权值内层区间,是因为区间线段树需要标记下传 ...

随机推荐

  1. 通过反编译看Java String及intern内幕--费元星站长

    通过反编译看Java String及intern内幕   一.字符串问题 字符串在我们平时的编码工作中其实用的非常多,并且用起来也比较简单,所以很少有人对其做特别深入的研究.倒是面试或者笔试的时候,往 ...

  2. 抽样分布(2) t分布

    定义 t分布 设X ~ N(0,1),Y ~ χ2(n),且X,Y相互独立,则称随机变量 服从自由度为n的t分布(学生氏分布) 记为 t~t(n),其概率密度为 由于tn(x)是偶函数,其图形关于y轴 ...

  3. 收集、分析线上日志数据实战——ELK

    本文来自网易云社区 作者:田躲躲 用户行为统计(User Behavior Statistics, UBS)一直是互联网产品中必不可少的环节,也俗称埋点.对于产品经理,运营人员来说,埋点当然是越多,覆 ...

  4. MySql 增加字段 删除字段 修改字段名称 修改字段类型

    //1.增加一个字段 alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段,默认为空 alter table user ...

  5. 负数取余/整除,Python和C语言的不同

    总结一句:Python中负数整除,是向负无穷取整,所以导致负数取余不对 在数学公式中,两种语言的表示算法都是一样的,都是: r=a-n*[a/n] 以上,r是余数,a是被除数,n是除数. 唯一不同点, ...

  6. Python简要标准库(1)

    sys sys这个模块让你能够访问与Python解释器联系紧密的变量和函数 其中的一些在下表 F argv 命令行参数,包括脚本名称 exit([arg]) 退出当前的程序,可选参数为给定的返回值或者 ...

  7. win32绘制自定义类窗口导致绘制11个窗口的解决办法

    上网查了一圈也没有找到解决问题的办法,一旦创建了一个窗口,并且在过程函数中绘制窗口,尤其是一些非子窗口的自定义类窗口,都会生成11个窗口(算上主窗口就是12个),但是使用系统通用控件就不会有这种情况的 ...

  8. 第一周 Welcome

    什么是机器学习 您也许一天用它几十次都不知道,每次你用google或者bing搜索网页感觉很厉害,因为他们用机器学习软件来设计网页排名,当你用Facebook或Apple的照片软件而它们知道照片里面哪 ...

  9. python3中使用python2中cmp函数出现错误

    在python2中我们经常会使用cmp函数来比较一些东西,但是在python3中,你再来使用这个函数的时候,发现就报错了,提示找不到这个函数,这是为啥呢? 答:新版的python已经舍弃这种用法 而在 ...

  10. LeetCode - 459. Repeated Substring Pattern - O(n)和O(n^2)两种思路 - KMP - (C++) - 解题报告

    题目 题目链接 Given a non-empty string check if it can be constructed by taking a substring of it and appe ...