两个月之前听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 教主的魔法(分块入门)相关推荐

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

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

  2. luogu P2801 教主的魔法

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

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

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

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

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

  5. P2801 教主的魔法

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

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

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

  7. [Luogu P2801]教主的魔法

    题意就是让我们维护一个数据结构,可以实现区间修改和区间查询多少个数大于等于给定值.这个据说线段树可以写但是我并没有想到qwq,于是我使用了"优雅的暴力"--分块. 分块做法十分显然 ...

  8. bzoj 3343 教主的魔法 分块

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

  9. #6279. 数列分块入门 3(区间修改,查询权值前驱)

    #6279. 数列分块入门 3 这是使用hzwer建议的set写的分块代码,set自动排序,支持二分查找,但是常数较大,比我下面写的用vector实现的分块慢了三倍,空间大了10倍. #include ...

最新文章

  1. nodejs如何利用rpc调用python
  2. html访问java接口出现缓存_高可用架构设计(3) -电商商品详情页缓存背景及框架说明...
  3. 【SICP练习】53 练习2.21
  4. Zygo保存zxg(Zemax File)文件(光学领域知道Zygo的一定要看)
  5. [Mac OSX技巧] 通过命令行开启安全性与隐私中的任何来源
  6. 蓝桥杯官网 试题 PREV-94 历届真题 矩阵计数【第十届】【决赛】【研究生组】【C++】解法
  7. elf文件的GOT和PLT
  8. 原子结构示意图全部_原子结构示意图知识点总结
  9. PSV破解流程+软件游戏安装(最简单/最快的方法整理,已测支持3.65~3.68,理论上支持全系列版本)
  10. Python | 基于basemap绘图的路径示意图
  11. BSCI社会责任验厂对员工考勤和工资的标准和要求
  12. 用JS通过新浪天气API接口获取天气
  13. 锂电池供电电路设计方案汇总(四款设计方案)
  14. 麦腾支付:跨境支付与区块链支付的发展前景分析
  15. 初识 CGI,CGI 简识
  16. 挑战Man Group!顶级对冲基金的10道Python面试题
  17. WiFi认证是如何保证企业WiFi的安全?
  18. 如何将ubuntu配置为路由器
  19. 黑白图片颜色反转并保存
  20. ]视音频编解码技术零基础学习方法

热门文章

  1. java字典序列化_Java对象序列化,Serialize Java Data Object,音标,读音,翻译,英文例句,英语词典...
  2. DeepDive-信息抽取工具安装教程
  3. Java枚举意义在哪_java – 多个if-else或枚举 – 哪一个更好,为什么?
  4. threadlocal存连接对象的目的_面试官:知道ThreadLocal嘛?谈谈你对它的理解?
  5. github上传文件夹教程
  6. cv2.cvtColor(img,p)图片格式转换的用法
  7. 【文本分类】基于BERT预训练模型的灾害推文分类方法、基于BERT和RNN的新闻文本分类对比
  8. cs go linux 参数,CSGO 命令大全 给新手的福利 使用设置参数
  9. 聊聊Mysql的那些破事儿
  10. 深入浅出Spring Security(二):FilterChainProxy的创建过程