题意:给定一个数列,维护: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 教主的魔法 二分法+分块相关推荐

  1. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  2. BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法

    http://www.lydsy.com/JudgeOnline/problem.php?id=3343  ||  https://www.luogu.org/problem/show?pid=280 ...

  3. luogu P2801 教主的魔法

    luogu P2801 教主的魔法 谜之分块 初学分块,找题练练手 大概分块示意图: 分块大法好! std: #include<bits/stdc++.h> using namespace ...

  4. 【bzoj3343】教主的魔法 (分块 + 二分)

    传送门(权限题) 题目分析 题意为:给定一个数列,修改和查询两种操作,修改每次给定一个区间,区间的所有元素都加上一个给定值,查询询问一段区间的数权值大于等于给定值的数有多少个. 首先对原序列分块,然后 ...

  5. P2801 教主的魔法(分块入门)

    两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; const int m ...

  6. 洛谷-P2801 教主的魔法 分块

    题目 题目链接 题意 修改:将一个区间内所有的数+C. 查询:查询一个区间内>C的数字有多少个. 题解 很经典的分快算法题目. 将数列分块以后,对块内的元素进行排序. 当我们要做修改操作的时候: ...

  7. [luoguP2801] 教主的魔法(二分 + 分块)

    传送门 以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的. 对于这个题,先分块,然后另开一个数组对于每个块内 ...

  8. bzoj 3343 教主的魔法 分块

    修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include< ...

  9. P2801 教主的魔法

    算是分块第一题了吧,抄题解过的. 简化版的题意:给你n个数的序列,支持区间加的修改,同时支持查询区间内大于等于w的数字的多少. 分块题的基本标志就是:xjb查询,普通修改.(来自qsc大佬的一句话) ...

最新文章

  1. 如何成为Android开发高手
  2. 【HDU 1542】Atlantis 矩形面积并(线段树,扫描法)
  3. 【转载】尝试使用GraphicsMagick的缩略图功能
  4. 7月Chrome谷歌浏览器份额以68.60%位居榜首
  5. tomcat源码环境构建
  6. 与David Blevins聊Java EE的未来
  7. Spring boot中使用aop详解
  8. 计算机开机后黑屏 只有鼠标,开机黑屏只有鼠标
  9. python 比较文件不同,在python中逐行比较两个不同的文件
  10. ServiceStack.Redis连接阿里云redis服务时使用连接池出现的问题
  11. Mac上功能强大图片查看编辑工具:zGallery
  12. 机器学习之K-means算法
  13. 基线检查工具Python代码
  14. docker搭建rap2
  15. Date时间里的GMT是什么意思
  16. 计算机数学基础①(Numbers)
  17. ROS学习笔记之导航(仿真)
  18. 圆满收官!第六届99趣拿节精彩盘点!
  19. SII-Slave Information Interface
  20. Python整型数据详述和进制转换

热门文章

  1. 服务器显卡驱动修复,AMD发布2020年首个显卡驱动:一口气修复27个Bug
  2. 求最大值c语言常用方法,c语言如何求最大值
  3. access 文本转换数字_LabVIEW访问Access数据库教程
  4. 怎么用python进行回归预测_使用Python训练回归模型并进行预测
  5. STM32学习之C语言知识复习
  6. Python笔记-centos7使用adb连接真实手机及初始化uiautomatro2项目
  7. java 一致性hash算法 均衡分发_Dubbo一致性哈希负载均衡的源码和Bug,了解一下?...
  8. apache shiro版本查看_深入学习SpringBoot(四):springboot整合shiro
  9. 1-1:网络初识之了解什么是协议以及TCP/IP协议
  10. Linux系统编程30:进程信号之产生信号的四种方式(Core Dump,kill,raise)