传送门

Description

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

Solution

这题是可以区间线段树套权值线段树来做的

但是我想练一下整体二分

顺便写一个树状数组的区间修改+区间查询

class BIT
{#define NM 50005#define lb(x) (x&(-x))private:ll t1[NM],t2[NM],N;BIT(){}public:BIT(int _n):N(_n){memset(t1,0,sizeof t1);memset(t2,0,sizeof t2);}inline void CC(int p,int v){for(reg int x=p;x<=N;x+=lb(x))t1[x]+=v,t2[x]+=v*p*1ll;}inline void C(int l,int r,int x){CC(l,x);CC(r+1,-x);}inline ll GG(int p){ll r=0;for(reg int x=p;x;x-=lb(x))r+=(p+1)*t1[x]-t2[x];return r;}inline ll G(int l,int r){return GG(r)-GG(l-1);}#undef NM#undef lb
};

Code

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline ll read()
{ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define reg register
class BIT
{#define NM 50005#define lb(x) (x&(-x))private:ll t1[NM],t2[NM],N;BIT(){}public:BIT(int _n):N(_n){memset(t1,0,sizeof t1);memset(t2,0,sizeof t2);}inline void CC(int p,int v){for(reg int x=p;x<=N;x+=lb(x))t1[x]+=v,t2[x]+=v*p*1ll;}inline void C(int l,int r,int x){CC(l,x);CC(r+1,-x);}inline ll GG(int p){ll r=0;for(reg int x=p;x;x-=lb(x))r+=(p+1)*t1[x]-t2[x];return r;}inline ll G(int l,int r){return GG(r)-GG(l-1);}#undef NM#undef lb
};
#define MN 50005
struct ques{int l,r,id,opt;ll c;}q[MN],b1[MN],b2[MN];
int n,m,tot,cnt,num[MN],Ans[MN];
void solve(int l=1,int r=tot,int ql=1,int qr=m)
{if(ql>qr) return;
//  printf("%d %d %d %d\n",l,r,ql,qr);static BIT T(n);register int i;if(l==r){for(i=ql;i<=qr;++i)if(q[i].opt==2)Ans[q[i].id]=num[l];return;}register int mid=(l+r+1)>>1,tpb1=0,tpb2=0;register ll tmp;for(i=ql;i<=qr;++i){if(q[i].opt==1){if(q[i].c>=num[mid]) T.C(q[i].l,q[i].r,1),b2[++tpb2]=q[i];else b1[++tpb1]=q[i];}else{tmp=T.G(q[i].l,q[i].r);if(tmp<q[i].c) q[i].c-=tmp,b1[++tpb1]=q[i];else b2[++tpb2]=q[i];}}for(i=ql;i<=qr;++i)if(q[i].c>=num[mid]&&q[i].opt==1) T.C(q[i].l,q[i].r,-1);bool has1=false,has2=false;for(i=1;i<=tpb1;++i) q[i+ql-1]=b1[i];for(i=1;i<=tpb2;++i) q[qr-tpb2+i]=b2[i];solve(l,mid-1,ql,ql+tpb1-1);solve(mid,r,qr-tpb2+1,qr);
}
int main()
{
//  freopen("testdata.in","r",stdin);
//  freopen("testdata.out","w",stdout);n=read();m=read();register int i;for(i=1;i<=m;++i){q[i].opt=read(),q[i].l=read(),q[i].r=read(),q[i].c=read();if(q[i].opt==1) num[++tot]=q[i].c;if(q[i].opt==2) q[i].id=++cnt;}std::sort(num+1,num+tot+1);tot=std::unique(num+1,num+tot+1)-num-1;solve();for(i=1;i<=cnt;++i) printf("%d\n",Ans[i]);return 0;
}

Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10172360.html

[bzoj 3110][zjoi 2013]K大数查询相关推荐

  1. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

  2. 3110: [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...

  3. bzoj3110 [Zjoi2013]K大数查询

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

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

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

  5. python【蓝桥杯vip练习题库】ALGO-1区间k大数查询

    试题 算法训练 区间k大数查询 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示 ...

  6. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

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

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

  8. 蓝桥杯-区间k大数查询(java)

    算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB问题描述给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个.输入格式第一行包含一个数n,表示序列长度.第二行包含n个 ...

  9. java:区间k大数查询

    试题 算法训练 区间k大数查询 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示 ...

最新文章

  1. 宽带Internet连接的类型—Vecloud微云
  2. 来篇文章:Martin Fowler的设计已死中文版
  3. 图像超分辨率近两年几篇优秀论文及代码
  4. 科大星云诗社动态20210514
  5. rabbitmq 延迟队列_框架系列|中间件RabbitMQ必看17道面试题
  6. Leetcode题库 15.三数之和_0(双指针 C实现)
  7. UOJ59 WC2013 小Q运动季
  8. opencv获取模板旋转角度_OpenCV入门之获取图像的旋转角度
  9. 广度优先搜索_快速入门广度优先搜索
  10. HttpInterceptor 拦截器 - 网络请求超时与重试的简单实现
  11. Informix 9.4和CSDK的安装
  12. 女人不需要哲学,因为哲学不能给她们带来面包
  13. 无废话C#设计模式系列文章
  14. Socket(服务器端)通信连接失败解决方法
  15. 如何对多个文件夹进行重命名?这个方法可以批量修改文件夹名、给文件夹名加统一前缀或后缀
  16. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE
  17. 2021年山东省职业院校技能大赛中职组网络安全赛项竞赛样题
  18. 阿朱说 企业SaaS 无题
  19. 【Multisim仿真】二阶有源高通滤波电路仿真
  20. VII python(1)基础知识

热门文章

  1. pythontcp服务器如何关闭阻塞_python 网络编程(socketserver,阻塞,其他方法)
  2. 为什么用python的时候特别卡_【后端开发】python为什么会运行慢
  3. k8s springboot 文件_用Kubernetes部署Springboot或Nginx,也就一个文件的事
  4. spring c3p0 mysql_spring boot整合mybatis使用c3p0数据源连接mysql
  5. cocos2dx mysql_初次接触cocos2dx
  6. python计算密集型提速_揭秘Numpy“高效使用哲学”,数值计算再提速10倍!
  7. 600分左右的计算机院校,600分左右的985大学 性价比最高的学校
  8. @bean 什么时候执行_离婚冷静期什么时候开始执行?
  9. c# combobox集合数据不显示_C#实战036:各种泛型的定义和使用详解
  10. 只能输入数字或含两位小数的正则