P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
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=;i<=n;i++)
{
belong[i]=(i-)/block+;
b[i]=a[i];
}
for(int i=;i<=num;i++)
{
l[i]=(i-)*block+;
r[i]=i*block;
}
r[num]=n;
for(int i=;i<=num;i++)
{
sort(b+l[i],b+r[i]+);
}
}
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]]+);
}
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]]+);
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]]+);
for(int i=belong[ll]+;i<=belong[rr]-;i++)
{
p[i]+=w;
}
}
}
int ask(int ll,int rr,int c)
{
int ans=;
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]+;i<belong[rr];i++)
{
int l1=l[i],r1=r[i],result=,mid;
while(l1<=r1)
{
mid=(l1+r1)>>;
if(b[mid]+p[i]>=c)
{
r1=mid-;
result=r[i]-mid+;
}
else
{
l1=mid+;
}
}
ans+=result;
}
printf("%d\n",ans);
}
}
int main()
{
int A,B,C;
char ch[];
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
build();
while(q--)
{
scanf("%s",ch);
scanf("%d%d%d",&A,&B,&C);
if(ch[]=='A')
{
ask(A,B,C);
}
else
{
update(A,B,C);
}
}
return ;
}
P2801 教主的魔法(分块入门)的更多相关文章
- 洛谷P2801 教主的魔法 [分块,二分答案]
题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...
- 洛谷P2801 教主的魔法 分块
正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...
- P2801 教主的魔法 (分块)
题目传送 长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作.修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少 ...
- P2801 教主的魔法(分块)
P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...
- 洛谷——P2801 教主的魔法(线段树or分块)
P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...
- 洛谷 P2801 教主的魔法 解题报告
P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...
- Luogu 2801 教主的魔法 | 分块模板题
Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
- P2801 教主的魔法 (线段树)
题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...
随机推荐
- RecyclerView和ListView比较
题记: RecyclerView说是目前最重要的控件也不为过,ListView虽然被RecyclerView光芒掩盖,但也仍有着自己的d地位:这个问题不是很偏重原理或实践,而更多的是,针对面试中会问到 ...
- ReentrantLock是如何基于AQS实现的
ReentrantLock是一个可重入的互斥锁,基于AQS实现,它具有与使用 synchronized 方法和语句相同的一些基本行为和语义,但功能更强大. lock和unlock ReentrantL ...
- OA发展史:由点到生态
在当今无边界组织的商业背景下,企业与员工关系已经转化为联盟关系,以往通过工作场所.劳动合同等约束的形式已经逐步弱化,管理行为空前复杂,OA正是将一个个散点整合起来的看不见的手.那么,推动OA发展的核心 ...
- Apache web服务器(LAMP架构)(week3_day4)--技术流ken
apache介绍 1).世界上使用率最高的网站服务器,最高时可达70%:官方网站:apache.org 2).http 超文本协议 HTML 超文本标记语言 3).URL 统一资源定位符 http:/ ...
- Java 中的几种线程池,你之前用对了吗
好久不发文章了,难道是因为忙,其实是因为懒.这是一篇关于线程池使用和基本原理的科普水文,如果你经常用到线程池,不知道你的用法标准不标准,是否有隐藏的 OOM 风险.不经常用线程池的同学,还有对几种线程 ...
- SpringIOC/DI(2)
2019-03-08/09:24:37 开发环境:IDEA 1.创建Spring项目 File--New--project--Spring--Creat empty Spring-config.xml ...
- HandlerThread原理分析
HandlerThread是一个内部拥有Handler和Looper的特殊Thread,可以方便地在子线程中处理消息. 简单使用 HandlerThread的使用比较简单. mHandlerThrea ...
- spring mvc 在上传图片时,浏览器报The request sent by the client was syntactically incorrect
项目中,在一个jsp页面里其它图片上传是功能是可以使用的,当我自己新加了一个图片上传时,提交表单后,浏览器报The request sent by the client was syntactical ...
- js实现自定义修改网页中表格信息
项目中的打印页面,为提高用户体验,需要增自定修改表格内容的功能,以下是使用示意图(双击td标签部分的内容,可自定义修改): 以下是js插件源码,存为edit.js文件: var tbl, tbt; v ...
- Tableau环图可视化
1.选择"记录数",拖拽两个记录数放入列中,求总和,选择饼图: 2.选择"大小",调整两个饼图的大小: 3.点击第二个总和(行上的),选择“双轴”: 4.点击坐 ...