「BZOJ3343」教主的魔法(分块+二分查找)
题意:
给定一个数列,您需要支持以下两种操作:
给[l,r]同加一个数
询问[l,r]中有多少数字大于或等于v
(n<=1000000,m<=3000)
题解
块内排序二分查询
修改就用个数组存整块的修改值
不完整的部分都暴力修改和查询
时间复杂度大概O(Qsqrt(n)logn)
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- using namespace std;
- const int N=;
- int n,m,a[N],b[N],block[N],L[],R[],cnt[],ans,Block;
- int find(int x,int y){
- int l=L[x];int r=R[x];
- int tmp=;
- while(l<=r){
- int mid=(l+r)>>;
- if(b[mid]>=y){
- tmp=mid;
- r=mid-;
- }
- else l=mid+;
- }
- return max(,R[x]-tmp+);
- }
- int main(){
- scanf("%d%d",&n,&m);
- Block=sqrt(n);
- for(int i=;i<=n;i++){
- scanf("%d",&a[i]);
- b[i]=a[i];
- block[i]=(i-)/Block+;
- if(!L[block[i]])L[block[i]]=i;
- R[block[i]]=i;
- }
- for(int i=;i<=block[n];i++)sort(b+L[i],b++R[i]);
- char s[];
- while(m--){
- scanf("%s",s);
- if(s[]=='A'){
- int l,r,c;
- ans=;
- scanf("%d%d%d",&l,&r,&c);
- if(block[l]==block[r]){
- for(int i=l;i<=r;i++)if(a[i]+cnt[block[i]]>=c)ans++;
- printf("%d\n",ans);
- continue;
- }
- for(int i=l;i<=R[block[l]];i++)if(a[i]+cnt[block[i]]>=c)ans++;
- for(int i=L[block[r]];i<=r;i++)if(a[i]+cnt[block[i]]>=c)ans++;
- if(block[l]+<block[r])
- for(int i=block[l]+;i<=block[r]-;i++)ans+=find(i,c-cnt[i]);
- printf("%d\n",ans);
- }
- else{
- int l,r,c;
- scanf("%d%d%d",&l,&r,&c);
- if(block[l]+<block[r])
- for(int i=block[l]+;i<=block[r]-;i++)cnt[i]+=c;
- for(int i=l;i<=R[block[l]];i++)a[i]+=c;
- for(int i=L[block[l]];i<=R[block[l]];i++)b[i]=a[i];
- sort(b+L[block[l]],b++R[block[l]]);
- for(int i=L[block[r]];i<=r;i++)a[i]+=c;
- for(int i=L[block[r]];i<=R[block[r]];i++)b[i]=a[i];
- sort(b+L[block[r]],b++R[block[r]]);
- }
- }
- return ;
- }
「BZOJ3343」教主的魔法(分块+二分查找)的更多相关文章
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
- 【BZOJ3343】教主的魔法 分块+二分
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
- 【bzoj3343】教主的魔法 分块
[bzoj3343]教主的魔法 2014年4月26日8092 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了 ...
- 「 Luogu P2801 」 教主的魔法——分块
# 解题思路 修改,就是一个区间修改的常规操作,但是为了迎合查询的需要,对两端的不完整的块需要暴力重构,重新进行排序操作,保证每一块都是单调上升的顺序. 然后再说进行查询的操作,起初,我们需要在每一个 ...
- 【BZOJ-3343】教主的魔法 分块
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 950 Solved: 414[Submit][Status][Discuss ...
- Bzoj 3343: 教主的魔法(分块+二分答案)
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...
- Bzoj 3343: 教主的魔法 分块,二分
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 821 Solved: 364[Submit][Status][Discuss ...
- BZOJ_3343_教主的魔法_分块+二分查找
BZOJ_3343_教主的魔法_分块+二分查找 题意:教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列被编号为 ...
- 「ZJOI2018」胖(ST表+二分)
「ZJOI2018」胖(ST表+二分) 不开 \(O_2\) 又没卡过去是种怎么体验... 这可能是 \(ZJOI2018\) 最简单的一题了...我都能 \(A\)... 首先我们发现这个奇怪的图每 ...
随机推荐
- MFC补码原码反码转换工具
/*_TCHAR str[100] = { 0 }; wsprintf(str, _T("%d"),num);*/ ; CString str; m_edit1.GetWindow ...
- SVN 部分常用命令
1. svn status 提交前显示出本地文本和版本库文本的区别 [url=] L abc.c # svn已经在.svn目录锁定了abc.c M bar.c # bar.c的内容已经在本地修改过了 ...
- pgpool-II在故障切换过程中是如何选举新主节点的
在pgpool的源代码中有有一个pgpool_main.c文件,在该文件中有一个pgpool的主函数pgpoolmain控制着pgpool的运行及相关操作. libpcp_ext.h文件中定义了pgp ...
- php面向对象的基础:OOP的常量
常量(constant) 用来表示不会改变的值.对于从该类实例化的任何对象来说,常量值在这些对象的整个生命周期中都保持不变. class Computer{ const PI=3.1415926; } ...
- Synchronization (computer science)
过程同步.数据同步. In computer science, synchronization refers to one of two distinct but related concepts: ...
- 路飞学城Python-Day15
模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还 ...
- How Javascript works (Javascript工作原理) (七) WebAssembly 对比 JavaScript 及其使用场景
个人总结: 1.webworkers实现了用多线程浏览器来进行多线程操作js的能力. 2.web workers不能操作dom,window,document等对象,一般用于cpu计算型的任务. ...
- js中获取数据类型
ES5中,js中数据类型:number.string.boolean.undefined.null.object js中获取数据类型常用的四种方式 实例: var a = 123, b = true, ...
- 安装 glusterfs yum源报错
yum install glusterfs-server yum 一直报错 把/etc/yum.repos.d 备份 删除了所有文件,从测试机192..168.59.128上同步过来 一直报错 已加载 ...
- [LeetCode] 155. minStack 设计最小栈
注意:getMin()时间复杂度为O(1) 最原始的方法: class MinStack(object): def __init__(self): """ initial ...