P2801 教主的魔法

区间加法,区间查询

显然就是分块辣

维护一个按块排好序的数组。

每次修改依然是整块打标记,零散块暴力。蓝后对零散块重新排序

询问时整块二分,零散块暴力就好辣

注意细节挺多和边界问题TAT

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
inline int Min(int a,int b){return a<b?a:b;}
void read(int &x){
static char c=getchar();x=;
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
}
#define N 1000005
int n,Len,m,a[N],b[N],add[];
inline int Bel(int x){return (x-)/Len+;}
void Add(int l,int r,int v){
register int i,p;
if(Bel(l)==Bel(r)){//注意l,r在同一块内,下同
p=Bel(l)*Len;
for(i=l;i<=r;++i) a[i]+=v;
for(i=p-Len+;i<=p;++i) b[i]=a[i];
sort(b+p-Len+,b+p);
return ;
}
p=Bel(l)*Len;
for(i=l;i<=p;++i) a[i]+=v;
for(i=p-Len+;i<=p;++i) b[i]=a[i];
sort(b+p-Len+,b+p);
for(i=Bel(l)+;i<Bel(r);++i) add[i]+=v;
p=(Bel(r)-)*Len+;
for(i=p;i<=r;++i) a[i]+=v;
for(i=Min(n,p+Len);i>=p;--i) b[i]=a[i];
sort(b+p,b+Min(n,p+Len));//注意最后一块右端不超过n
}
int Ask(int l,int r,int v){
register int i,p,re=;
if(Bel(l)==Bel(r)){
for(i=l;i<=r;++i) re+=(a[i]>=v-add[Bel(l)]);
return re;
}
p=Bel(l)*Len;
for(i=l;i<=p;++i) re+=(a[i]>=v-add[Bel(l)]);
for(i=Bel(l)+;i<Bel(r);++i){
int tmp=lower_bound(b+(i-)*Len+,b+i*Len,v-add[i])-b;
re+=i*Len-tmp+(b[tmp]>=v-add[i]);//如果整块都>v-add[i],注意lower_bound找到的tmp仍指向块的开头
}
p=(Bel(r)-)*Len+;
for(i=p;i<=r;++i) re+=(a[i]>=v-add[Bel(r)]);
return re;
}
int main(){
register int i;
char opt[]; int q1,q2,q3;
read(n);read(m); Len=sqrt(n);
for(i=;i<=n;++i) read(a[i]),b[i]=a[i];
for(i=;i+Len<=n;i+=Len) sort(b+i,b+i+Len);
sort(b+i,b+n+);
while(m--){
scanf("%s%d%d%d",opt,&q1,&q2,&q3);
if(opt[]=='M') Add(q1,q2,q3);
else if(opt[]=='A') printf("%d\n",Ask(q1,q2,q3));
}return ;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. P2801 教主的魔法 (线段树)

    题目 P2801 教主的魔法 解析 成天做水题 线段树,第一问区间加很简单 第二问可以维护一个区间最大值和一个区间最小值,若C小于等于区间最小值,就加上区间长度,若C大于区间最大值,就加0 ps:求教 ...

随机推荐

  1. word2vec模型评估方案

    1.word2vec参数详解 · sentences:可以是一个·ist,对于大语料集,建议使用BrownCorpus,Text8Corpus或·ineSentence构建.· sg: 用于设置训练算 ...

  2. centos 打包报错License for package Android SDK Build-Tools 25.0.3 not accepted

    报错如下: 提示没有25.0.3的安卓环境,那么,接下来就需要安装这个环境 1.android list sdk -a 会显示需要更新 类似如下(截图只是一部分,前后还有一部分): 2.android ...

  3. pandas.query()

    1. 查询 已知data: 查询概率等于0.4的所有行 问题所在:query后面只支持string形式的值,而"probability"==0.4返回的是一个bool类型,结果不是 ...

  4. vim 常用

    Format JSON :%!python -m json.tool 1. define custom function and use it define function in .vimrc fu ...

  5. cocos2d JS-(JavaScript) 基础语法间的函数方法相互调用

    1.函数嵌套函数 function calcuate(opr, a, b) { // 定义函数,opr - -> 符号,a,b - -> 数值 //定义 + 函数 function add ...

  6. cocos2d-x C++ (iOS)集成第三方微信分享

    1.新建项目并下载 ShareSDK 1.Cocos2d-x项目环境搭建,不会的童鞋自行面壁哈: 网页链接. 2.ShareSDK iOS版本的 Cocos2d-x 插件是在ShareSDK iOS版 ...

  7. Linux shell脚本 批量创建多个用户

    Linux shell脚本 批量创建多个用户 #!/bin/bash groupadd charlesgroup for username in charles1 charles2 charles3 ...

  8. TP5数据库操作方法

    一.TP5数据库操作方法 1.name()方法作用 : 指定默认的数据表名(不含前缀)示例 : Db::name(‘weiba_post’);返回 : Db对象 2.setTable()方法作用 : ...

  9. aop编程之前置通知

    aop( Aspect-Oriented Programming)前置通知原理案例讲解 编程步骤: 定义接口 编写对象(被代理的对象即目标对象) 编写通知(前置通知即目标方法调用前调用) 在beans ...

  10. 将Web项目War包部署到Tomcat服务器基本步骤

    参考来源: http://www.cnblogs.com/pannysp/archive/2012/03/07/2383364.html 1. 常识:   1.1 War包 War包一般是在进行Web ...