题目链接

  激动qwq。这是我A的第一道分块。

  分块之后对块内元素暴力sort。修改的时候对于整块打个标记,查询的时候只需要查C-tag就行了

  对于非整块,暴力修改,改完之后sort

  对于查询……非整块暴力查询,整块二分C-tag的位置就好啦

  

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#define maxn 1000010
#define sqtn 1200
using namespace std; inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Node{
int dat,id;
bool operator <(const Node a)const{
return dat<a.dat;
}
}; struct Block{
Node q[sqtn];
int tag,tot;
Block(){memset(q,,sizeof(q)); tag=tot=; }
}que[sqtn];
int d[maxn];
int s[maxn];
int w[maxn];
int le[sqtn],ri[sqtn]; void sorten(int x){
Block &o=que[x];
sort(o.q+,o.q+o.tot+);
for(int i=;i<=o.tot;++i){
w[o.q[i].id]=i;
}
} int main(){
int n=read(),m=read();
int sqt=sqrt(n),blo=;
for(int i=;i<=n;++i){
d[i]=read();
s[i]=(i-)/sqt+;
if(s[i]>blo) blo=s[i];
ri[s[i]]=i;
}
for(int i=n;i>=;--i){
le[s[i]]=i;
que[s[i]].q[++que[s[i]].tot]=(Node){d[i],i};
}
for(int i=;i<=blo;++i) sorten(i);
for(int i=;i<=m;++i){
char c[];int x,y,z;
scanf("%s%d%d%d",c,&x,&y,&z);
if(c[]=='M'){
int to=min(ri[s[x]],y);
for(int j=x;j<=to;++j) que[s[x]].q[w[j]].dat+=z;
sorten(s[x]);
if(s[x]==s[y]) continue;
int from=max(le[s[y]],x);
for(int j=from;j<=y;++j) que[s[y]].q[w[j]].dat+=z;
sorten(s[y]);
for(int j=s[x]+;j<s[y];++j) que[j].tag+=z;
}
else if(c[]=='A'){
int to=min(ri[s[x]],y),ans=;
for(int j=x;j<=to;++j)
if(que[s[x]].q[w[j]].dat>=z) ans++;
if(s[x]==s[y]){
printf("%d\n",ans);
continue;
}
int from=max(le[s[y]],x);
for(int j=from;j<=y;++j){
//printf("%d\n",que[s[y]].q[w[j]].dat);
if(que[s[y]].q[w[j]].dat>=z) ans++;
}
for(int j=s[x]+;j<s[y];++j){
Block now=que[j];
int l=,r=now.tot,lim=r+;
while(l<=r){
int mid=(l+r)>>;
if(now.q[mid].dat>=z-now.tag){
lim=mid;
r=mid-;
}
else l=mid+;
}
ans+=now.tot-lim+;
}
printf("%d\n",ans);
}
}
return ;
}
/*
5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
*/

【Luogu】P2801教主的魔法(分块)的更多相关文章

  1. Luogu 2801 教主的魔法 | 分块模板题

    Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...

  2. 洛谷P2801 教主的魔法 [分块,二分答案]

    题目传送门 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. ...

  3. luogu P2801 教主的魔法

    题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是 ...

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

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

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

    正解:分块 解题报告: 哇之前的坑还没填完就又写新博客? 不管不管,之前欠的两三篇题解大概圣诞节之前会再仔细想想然后重新写下题解趴,确实还挺难的感觉没有很好的理解呢QAQ还是太囫囵吞枣不求甚解了,这样 ...

  6. P2801 教主的魔法 (分块)

    题目传送 长度为\(n(n\le 1000000)\)的数组,\(q(q\le 3000)\) 次操作.修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少 ...

  7. P2801 教主的魔法(分块)

    P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...

  8. 洛谷——P2801 教主的魔法(线段树or分块)

    P2801 教主的魔法 (1) 若第一个字母为“M”,则紧接着有三个数字L.R.W.表示对闭区间 [L, R] 内所有英雄的身高加上W. (2) 若第一个字母为“A”,则紧接着有三个数字L.R.C.询 ...

  9. 洛谷 P2801 教主的魔法 解题报告

    P2801 教主的魔法 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.--.N. ...

  10. BZOJ 3343: 教主的魔法(分块+二分查找)

    BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved:  ...

随机推荐

  1. input输入大于0的小数和整数

    <input onkeyup="num(this)"onbeforepaste="num(this)"> <script src='jquer ...

  2. 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest H Milestones1 (暴力)

    预处理+暴力,每个颜色都是独立的,求个前缀和,减一减判断一个在区间内颜色是否存在. 算了算复杂度好像有点勉强,但是还是过了,学了主席树以后用主席树在做一下 #include<bits/stdc+ ...

  3. NBear简介与使用图解

    NBear简介与使用图解 框架类型:ORM映射框架 简介:NBear是一个基于.Net 2.0.C#2.0开放全部源代码的的软件开发框架类库.NBear的设计目标是尽最大努力减少开发人员的工作量,最大 ...

  4. UML各种图总结

    UML(Unified Modeling Language)是一种统一建模语言,为面向对象开发系统的产品进行说明.可视化.和编制文档的一种标准语言.下面将对UML的九种图+包图的基本概念进行介绍以及各 ...

  5. Java压缩字符串工具类

    StringCompressUtils.java package javax.utils; import java.io.ByteArrayInputStream; import java.io.By ...

  6. php的字符转换 & php登入注册界面设计以及源码 & 分离公共部分

    我们在编写的时候总是会出现乱码 https://www.cnblogs.com/mafeng/p/5827215.html php登入注册界面设计以及源码 https://blog.csdn.net/ ...

  7. Python——基本运算符

    计算机不止可以进行加减乘除,还可以进行多种运算,比如算数运算,逻辑运算,赋值运算等 算数运算 以下假设变量:a=10,b=20 比较运算 以下假设变量:a=10,b=20 赋值运算 以下假设变量:a= ...

  8. JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)

    经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...

  9. 微信小程序传值取值的几种方法

    一,列表index下的取值 实现方式是:data-index="{{index}}"挖坑及e.currentTarget.dataset.index来填坑即可 1.1生成值 < ...

  10. 【Git版本控制】Git的merge合并分支命令

    1.实例 git checkout master git merge dev merge合并分支只对当前分支master产生影响,被合并的分支dev不受影响. 假设你有两个分支,“stable” 和 ...