BZOJ3343 教主的魔法 二分法+分块
题意:给定一个数列,维护:1、[L,R]之间所有的数+=W 2、求[L,R]中大于等于C的数的数量
题解:更新用add标记,头尾俩块暴力重构;查询将每个块排序然后二分找。
#include <cmath> #include <ctime> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std;const int MAXS=1000+2; struct BLOCK{int a[MAXS],b[MAXS],add; }block[MAXS]; int N,M,S; char s;void Update(int l,int r,int x){if((l-1)%S){int p=(l-1)/S+1;for(int i=l-S*(p-1);i<=S && i<=r-(p-1)*S;i++) block[p].a[i]+=x;for(int i=1;i<=S;i++) block[p].b[i]=block[p].a[i];sort(block[p].b+1,block[p].b+S+1);l=p*S+1;}while(l+S-1<=r) block[l/S+1].add+=x,l+=S;if(r%S){int p=l/S+1;r-=S*(p-1);for(int i=1;i<=r;i++) block[p].a[i]+=x;for(int i=1;i<=S;i++) block[p].b[i]=block[p].a[i];sort(block[p].b+1,block[p].b+S+1);} }int Find(int p,int l,int r,int c){c-=block[p].add;int m=(l+r)>>1;while(l<=r){if(block[p].b[m]<c) l=m+1;else r=m-1;m=(l+r)>>1;}return S-l+1; }int Query(int l,int r,int c){int ret=0;if((l-1)%S){int p=(l-1)/S+1;for(int i=l-S*(p-1);i<=r-S*(p-1) && i<=S;i++)if(block[p].a[i]>=c-block[p].add) ret++;l=p*S+1;}while(l+S-1<=r) ret+=Find(l/S+1,1,S,c),l+=S;if(r%S){int p=l/S+1;for(int i=1;i<=r-S*(p-1);i++)if(block[p].a[i]>=c-block[p].add) ret++;}return ret; }int main(){memset(block,0X7F,sizeof(block));block[1].add=0;cin >> N >> M,S=(int)sqrt(N);for(int i=1,j=1,k=1;i<=N;i++,j++){cin >> block[k].a[j],block[k].b[j]=block[k].a[j];if(j==S || i==N){sort(block[k].b+1,block[k].b+j+1);k++,j=0,block[k].add=0;}}N=(N%S?N/S+1:N/S);for(int i=1,l,r,x;i<=M;i++){cin >> s;cin >> l >> r >> x;if(s=='M') Update(l,r,x);if(s=='A') cout << Query(l,r,x) << endl;}return 0; }
View Code
转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6464169.html
BZOJ3343 教主的魔法 二分法+分块相关推荐
- Bzoj 3343: 教主的魔法(分块+二分答案)
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...
- BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法
http://www.lydsy.com/JudgeOnline/problem.php?id=3343 || https://www.luogu.org/problem/show?pid=280 ...
- luogu P2801 教主的魔法
luogu P2801 教主的魔法 谜之分块 初学分块,找题练练手 大概分块示意图: 分块大法好! std: #include<bits/stdc++.h> using namespace ...
- 【bzoj3343】教主的魔法 (分块 + 二分)
传送门(权限题) 题目分析 题意为:给定一个数列,修改和查询两种操作,修改每次给定一个区间,区间的所有元素都加上一个给定值,查询询问一段区间的数权值大于等于给定值的数有多少个. 首先对原序列分块,然后 ...
- P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; const int m ...
- 洛谷-P2801 教主的魔法 分块
题目 题目链接 题意 修改:将一个区间内所有的数+C. 查询:查询一个区间内>C的数字有多少个. 题解 很经典的分快算法题目. 将数列分块以后,对块内的元素进行排序. 当我们要做修改操作的时候: ...
- [luoguP2801] 教主的魔法(二分 + 分块)
传送门 以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的. 对于这个题,先分块,然后另开一个数组对于每个块内 ...
- bzoj 3343 教主的魔法 分块
修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include< ...
- P2801 教主的魔法
算是分块第一题了吧,抄题解过的. 简化版的题意:给你n个数的序列,支持区间加的修改,同时支持查询区间内大于等于w的数字的多少. 分块题的基本标志就是:xjb查询,普通修改.(来自qsc大佬的一句话) ...
最新文章
- 如何成为Android开发高手
- 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
- 【转载】尝试使用GraphicsMagick的缩略图功能
- 7月Chrome谷歌浏览器份额以68.60%位居榜首
- tomcat源码环境构建
- 与David Blevins聊Java EE的未来
- Spring boot中使用aop详解
- 计算机开机后黑屏 只有鼠标,开机黑屏只有鼠标
- python 比较文件不同,在python中逐行比较两个不同的文件
- ServiceStack.Redis连接阿里云redis服务时使用连接池出现的问题
- Mac上功能强大图片查看编辑工具:zGallery
- 机器学习之K-means算法
- 基线检查工具Python代码
- docker搭建rap2
- Date时间里的GMT是什么意思
- 计算机数学基础①(Numbers)
- ROS学习笔记之导航(仿真)
- 圆满收官!第六届99趣拿节精彩盘点!
- SII-Slave Information Interface
- Python整型数据详述和进制转换
热门文章
- 服务器显卡驱动修复,AMD发布2020年首个显卡驱动:一口气修复27个Bug
- 求最大值c语言常用方法,c语言如何求最大值
- access 文本转换数字_LabVIEW访问Access数据库教程
- 怎么用python进行回归预测_使用Python训练回归模型并进行预测
- STM32学习之C语言知识复习
- Python笔记-centos7使用adb连接真实手机及初始化uiautomatro2项目
- java 一致性hash算法 均衡分发_Dubbo一致性哈希负载均衡的源码和Bug,了解一下?...
- apache shiro版本查看_深入学习SpringBoot(四):springboot整合shiro
- 1-1:网络初识之了解什么是协议以及TCP/IP协议
- Linux系统编程30:进程信号之产生信号的四种方式(Core Dump,kill,raise)