修改直接对整块打标记,两边暴力。

查询需要保证每个整块有序,所以在修改时排序就好啦

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 1000005
using namespace std;
int n,m,nn,be[N],lazy[1005],ans;
int a[N],b[N];
void work(int x)
{int l=(x-1)*nn+1,r=min(n,x*nn);for(int i=l;i<=r;i++)b[i]=a[i];sort(b+l,b+r+1);
}
int main()
{scanf("%d%d",&n,&m);nn=(int)sqrt(n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);be[i]=(i-1)/nn+1;}int tot=be[n];for(int i=1;i<=tot;i++)work(i);char ch; int l,r,c,num;while(m--){ch=getchar();while(ch!='A'&&ch!='M') ch=getchar();scanf("%d%d%d",&l,&r,&c);if(ch=='M'){if(be[l]==be[r]){for(int i=l;i<=r;i++) a[i]+=c;work(be[l]);continue;}for(int i=be[l]+1;i<be[r];i++) lazy[i]+=c;for(int i=l;i<=be[l]*nn;i++) a[i]+=c;for(int i=(be[r]-1)*nn+1;i<=r;i++) a[i]+=c;work(be[l]); work(be[r]);}else{int x; ans=0;if(be[l]==be[r]){for(int i=l;i<=r;i++)if(a[i]+lazy[be[i]]>=c)ans++;printf("%d\n",ans);continue;}for(int i=be[l]+1;i<be[r];i++){x=c-lazy[i];int L=(i-1)*nn+1,R=min(n,i*nn);num=lower_bound(b+L,b+R+1,x)-b;ans+=R-num+1;}for(int i=l;i<=be[l]*nn;i++)if(a[i]+lazy[be[i]]>=c)ans++;for(int i=(be[r]-1)*nn+1;i<=r;i++)if(a[i]+lazy[be[i]]>=c)ans++;printf("%d\n",ans);}}return 0;
}

转载于:https://www.cnblogs.com/Ren-Ivan/p/7746749.html

bzoj 3343 教主的魔法 分块相关推荐

  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. bzoj 3343: 教主的魔法

    这个的修改直接是对于块开一个数组,记录修改的值就好了,,,(像不像标记永久化??(2333,不知道从哪里掏出来的词)) 都是很朴素的分块 1 #include<bits/stdc++.h> ...

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

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

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

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

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

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

  7. luogu P2801 教主的魔法

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

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

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

  9. BZOJ3343 教主的魔法 二分法+分块

    题意:给定一个数列,维护:1.[L,R]之间所有的数+=W  2.求[L,R]中大于等于C的数的数量 题解:更新用add标记,头尾俩块暴力重构:查询将每个块排序然后二分找. #include < ...

最新文章

  1. Python 正则 —— 捕获与分组
  2. Oracle查看死锁 .
  3. Python高级语法-详解set机制
  4. [Linux学习笔记] Linux常用命令 - 文件搜索命令
  5. LeetCode 3 Longest Substring Without Repeating Characters 区间,想法 难度:1
  6. EVC获取当前工作路径
  7. html+jquery翻页相册(原创)
  8. javascript函数防抖Debounce
  9. linux7mysql集群_linux下mysql集群搭建
  10. 网络出版服务许可证 你了解吗?
  11. 百度拼音输入法 v2.10.2.52 官方免费版
  12. PTA-寻找孪生素数
  13. 乔布斯斯坦福大学演讲
  14. 2015中国国内元器件分销商10亿俱乐部20强榜单
  15. DIV根据里面文字自动撑开
  16. 关于 CSS,你该了解这些
  17. 申请工作居住证政策解答
  18. ReleaseDC、DeleteDC(买二送一DeleteObject)简单解析
  19. 常见的引脚功能介绍(基于ADSP-SC589芯片)
  20. 怎么登陆和退出MySQL

热门文章

  1. DataGridView数据更新至数据库-逐条更新
  2. 活动目录网域中禁用移动存储(U盘)
  3. [新手必备]Python 基础入门必学知识点笔记
  4. linux平滑升级nginx,Nginx的平滑重启和平滑升级,nginx
  5. python | np.eye()函数
  6. java考题_Java考题知识点
  7. mysql utf8跟utf8mb4_MySQL utf8 和 utf8mb4 的区别
  8. android 按钮点击间隔,如何自定义android中按下的长/延迟按钮的时间间隔
  9. jsch设置代理_尽管在JSch中设置了STRICT_HOST_CHECKING,但仍获取UnknownHostKey异常
  10. RabbitMQ单个发布确认