[bzoj 3110][zjoi 2013]K大数查询
传送门
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大数查询相关推荐
- bzoj 3110: [Zjoi2013]K大数查询(树套树)
树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...
- 3110: [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...
- bzoj3110 [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 10703 Solved: 3209 [Submit][ ...
- [BZOJ3110] [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 9208 Solved: 2737 [Submit][S ...
- python【蓝桥杯vip练习题库】ALGO-1区间k大数查询
试题 算法训练 区间k大数查询 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示 ...
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- BZOJ3110: [Zjoi2013]K大数查询
BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...
- 蓝桥杯-区间k大数查询(java)
算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB问题描述给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个.输入格式第一行包含一个数n,表示序列长度.第二行包含n个 ...
- java:区间k大数查询
试题 算法训练 区间k大数查询 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示 ...
最新文章
- 宽带Internet连接的类型—Vecloud微云
- 来篇文章:Martin Fowler的设计已死中文版
- 图像超分辨率近两年几篇优秀论文及代码
- 科大星云诗社动态20210514
- rabbitmq 延迟队列_框架系列|中间件RabbitMQ必看17道面试题
- Leetcode题库 15.三数之和_0(双指针 C实现)
- UOJ59 WC2013 小Q运动季
- opencv获取模板旋转角度_OpenCV入门之获取图像的旋转角度
- 广度优先搜索_快速入门广度优先搜索
- HttpInterceptor 拦截器 - 网络请求超时与重试的简单实现
- Informix 9.4和CSDK的安装
- 女人不需要哲学,因为哲学不能给她们带来面包
- 无废话C#设计模式系列文章
- Socket(服务器端)通信连接失败解决方法
- 如何对多个文件夹进行重命名?这个方法可以批量修改文件夹名、给文件夹名加统一前缀或后缀
- EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE
- 2021年山东省职业院校技能大赛中职组网络安全赛项竞赛样题
- 阿朱说 企业SaaS 无题
- 【Multisim仿真】二阶有源高通滤波电路仿真
- VII python(1)基础知识
热门文章
- pythontcp服务器如何关闭阻塞_python 网络编程(socketserver,阻塞,其他方法)
- 为什么用python的时候特别卡_【后端开发】python为什么会运行慢
- k8s springboot 文件_用Kubernetes部署Springboot或Nginx,也就一个文件的事
- spring c3p0 mysql_spring boot整合mybatis使用c3p0数据源连接mysql
- cocos2dx mysql_初次接触cocos2dx
- python计算密集型提速_揭秘Numpy“高效使用哲学”,数值计算再提速10倍!
- 600分左右的计算机院校,600分左右的985大学 性价比最高的学校
- @bean 什么时候执行_离婚冷静期什么时候开始执行?
- c# combobox集合数据不显示_C#实战036:各种泛型的定义和使用详解
- 只能输入数字或含两位小数的正则