P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹
#include<bits/stdc++.h> using namespace std; const int maxn=1e6+7; int belong[maxn]; int a[maxn]; int b[maxn]; int d[maxn]; int l[maxn]; int r[maxn]; int p[maxn]; int n,q; int num,block; void build()//预处理块 {block=sqrt(n);num=n/block;if(n%block){num++;}for(int i=1;i<=n;i++){belong[i]=(i-1)/block+1;b[i]=a[i];}for(int i=1;i<=num;i++){l[i]=(i-1)*block+1;r[i]=i*block;}r[num]=n;for(int i=1;i<=num;i++){sort(b+l[i],b+r[i]+1);} } void update(int ll,int rr,int w) {if(belong[ll]==belong[rr]){for(int i=ll;i<=rr;i++){a[i]+=w;}for(int i=l[belong[ll]];i<=r[belong[ll]];i++){b[i]=a[i];}sort(b+l[belong[ll]],b+r[belong[ll]]+1);}else{for(int i=ll;i<=r[belong[ll]];i++){a[i]+=w;} for(int i=l[belong[ll]];i<=r[belong[ll]];i++){b[i]=a[i];}sort(b+l[belong[ll]],b+r[belong[ll]]+1);for(int i=l[belong[rr]];i<=rr;i++){a[i]+=w;}for(int i=l[belong[rr]];i<=r[belong[rr]];i++){b[i]=a[i];}sort(b+l[belong[rr]],b+r[belong[rr]]+1);for(int i=belong[ll]+1;i<=belong[rr]-1;i++){p[i]+=w;}} } int ask(int ll,int rr,int c) {int ans=0;if(belong[ll]==belong[rr]){for(int i=ll;i<=rr;i++){if(a[i]+p[belong[i]]>=c){ans++;}}printf("%d\n",ans);}else{for(int i=ll;i<=r[belong[ll]];i++){if(a[i]+p[belong[i]]>=c){ans++;}}for(int i=l[belong[rr]];i<=rr;i++){if(a[i]+p[belong[i]]>=c){ans++;}} for(int i=belong[ll]+1;i<belong[rr];i++){int l1=l[i],r1=r[i],result=0,mid;while(l1<=r1){mid=(l1+r1)>>1;if(b[mid]+p[i]>=c){r1=mid-1;result=r[i]-mid+1;}else{l1=mid+1;}}ans+=result;}printf("%d\n",ans);} } int main() {int A,B,C;char ch[5];scanf("%d%d",&n,&q);for(int i=1;i<=n;i++){scanf("%d",&a[i]);} build();while(q--){scanf("%s",ch);scanf("%d%d%d",&A,&B,&C);if(ch[0]=='A'){ask(A,B,C);}else{update(A,B,C);}}return 0; }
转载于:https://www.cnblogs.com/LJB666/p/10779131.html
P2801 教主的魔法(分块入门)相关推荐
- 洛谷-P2801 教主的魔法 分块
题目 题目链接 题意 修改:将一个区间内所有的数+C. 查询:查询一个区间内>C的数字有多少个. 题解 很经典的分快算法题目. 将数列分块以后,对块内的元素进行排序. 当我们要做修改操作的时候: ...
- luogu P2801 教主的魔法
luogu P2801 教主的魔法 谜之分块 初学分块,找题练练手 大概分块示意图: 分块大法好! std: #include<bits/stdc++.h> using namespace ...
- 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 ...
- P2801 教主的魔法
算是分块第一题了吧,抄题解过的. 简化版的题意:给你n个数的序列,支持区间加的修改,同时支持查询区间内大于等于w的数字的多少. 分块题的基本标志就是:xjb查询,普通修改.(来自qsc大佬的一句话) ...
- 【bzoj3343】教主的魔法 (分块 + 二分)
传送门(权限题) 题目分析 题意为:给定一个数列,修改和查询两种操作,修改每次给定一个区间,区间的所有元素都加上一个给定值,查询询问一段区间的数权值大于等于给定值的数有多少个. 首先对原序列分块,然后 ...
- [Luogu P2801]教主的魔法
题意就是让我们维护一个数据结构,可以实现区间修改和区间查询多少个数大于等于给定值.这个据说线段树可以写但是我并没有想到qwq,于是我使用了"优雅的暴力"--分块. 分块做法十分显然 ...
- bzoj 3343 教主的魔法 分块
修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include< ...
- #6279. 数列分块入门 3(区间修改,查询权值前驱)
#6279. 数列分块入门 3 这是使用hzwer建议的set写的分块代码,set自动排序,支持二分查找,但是常数较大,比我下面写的用vector实现的分块慢了三倍,空间大了10倍. #include ...
最新文章
- nodejs如何利用rpc调用python
- html访问java接口出现缓存_高可用架构设计(3) -电商商品详情页缓存背景及框架说明...
- 【SICP练习】53 练习2.21
- Zygo保存zxg(Zemax File)文件(光学领域知道Zygo的一定要看)
- [Mac OSX技巧] 通过命令行开启安全性与隐私中的任何来源
- 蓝桥杯官网 试题 PREV-94 历届真题 矩阵计数【第十届】【决赛】【研究生组】【C++】解法
- elf文件的GOT和PLT
- 原子结构示意图全部_原子结构示意图知识点总结
- PSV破解流程+软件游戏安装(最简单/最快的方法整理,已测支持3.65~3.68,理论上支持全系列版本)
- Python | 基于basemap绘图的路径示意图
- BSCI社会责任验厂对员工考勤和工资的标准和要求
- 用JS通过新浪天气API接口获取天气
- 锂电池供电电路设计方案汇总(四款设计方案)
- 麦腾支付:跨境支付与区块链支付的发展前景分析
- 初识 CGI,CGI 简识
- 挑战Man Group!顶级对冲基金的10道Python面试题
- WiFi认证是如何保证企业WiFi的安全?
- 如何将ubuntu配置为路由器
- 黑白图片颜色反转并保存
- ]视音频编解码技术零基础学习方法
热门文章
- java字典序列化_Java对象序列化,Serialize Java Data Object,音标,读音,翻译,英文例句,英语词典...
- DeepDive-信息抽取工具安装教程
- Java枚举意义在哪_java – 多个if-else或枚举 – 哪一个更好,为什么?
- threadlocal存连接对象的目的_面试官:知道ThreadLocal嘛?谈谈你对它的理解?
- github上传文件夹教程
- cv2.cvtColor(img,p)图片格式转换的用法
- 【文本分类】基于BERT预训练模型的灾害推文分类方法、基于BERT和RNN的新闻文本分类对比
- cs go linux 参数,CSGO 命令大全 给新手的福利 使用设置参数
- 聊聊Mysql的那些破事儿
- 深入浅出Spring Security(二):FilterChainProxy的创建过程