题意:

有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的

思路:

分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记,

对于查询查操作,块内排序然后二分即可

复杂度O(T(sqrt(n)+sqrt(n)logn))

代码:

可以弄两个数组对应着写,会比我这样stl乱写快一倍

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
//#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 1e6+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f; //const db pi = acos(-1.0); struct node{
int id;
ll v;
};
int n, q;
vector<node>blc[maxn];
int block;
bool cmp(node a, node b){
return a.v<b.v;
}
ll add[maxn];
int main(){
scanf("%d %d", &n, &q);
int block = (int)sqrt(n);
for(int i = ; i < n; i++){
node tmp;
tmp.id = i;
scanf("%lld", &tmp.v);
blc[i/block].pb(tmp);
}
for(int i = ; i <= (n-)/block; i++){
sort(blc[i].begin(), blc[i].end(), cmp);
}
while(q--){
char op[];
int x, y;
ll w;
scanf("%s",op+);
scanf("%d %d %lld", &x, &y, &w);
x--;y--;
int bx = x/block;
int by = y/block;
if(op[]=='M'){
if(bx==by){
for(int i = ; i < (int)blc[bx].size(); i++){
node a = blc[bx][i];
if(a.id>=x&&a.id<=y)blc[bx][i].v+=w;
}
sort(blc[bx].begin(), blc[bx].end(),cmp);
}
else{
int rx = min(n-, (bx+)*block-);
int ly = by*block;
for(int i = ; i < (int)blc[bx].size(); i++){
int id = blc[bx][i].id;
if(id>=x&&id<=y)blc[bx][i].v+=w;
}sort(blc[bx].begin(), blc[bx].end(),cmp);
for(int i = ; i < (int)blc[by].size(); i++){
int id = blc[by][i].id;
if(id>=x&&id<=y)blc[by][i].v+=w;
}sort(blc[by].begin(), blc[by].end(),cmp);
for(int i = bx+; i < by; i++){
add[i]+=w;
}
}
}
else{
int ans = ;
if(bx==by){
for(int i = ; i < (int)blc[bx].size(); i++){
int id = blc[bx][i].id;
if(id>=x&&id<=y&&blc[bx][i].v+add[bx]>=w)ans++;
}
}
else{
for(int i = ; i < (int)blc[bx].size(); i++){
int id = blc[bx][i].id;
if(id>=x&&id<=y&&blc[bx][i].v+add[bx]>=w)ans++;
}
for(int i = ; i < (int)blc[by].size(); i++){
int id = blc[by][i].id;
if(id>=x&&id<=y&&blc[by][i].v+add[by]>=w)ans++;
}
//printf("--%d\n",ans);
for(int i = bx+; i < by; i++){
ll x = w-add[i];
int l = ;
int r = block-;
int pos = block;
while(l<=r){
int mid = (l+r)>>;
if(blc[i][mid].v>=x){
pos = mid;
r = mid-;
}
else l = mid+;
}
ans+=block-pos;
}
}
printf("%d\n",ans);
}
}
return ;
}
/*
5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4 5 7
3 1 4 2 5
A 1 5 4
M 3 5 1
M 3 5 2
A 1 5 4
M 1 1 3
A 1 5 4
A 1 5 10 5 3
3 1 4 2 5
A 1 5 10
M 1 5 2
A 1 5 10
*/

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

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

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

  2. BZOJ 3343: 教主的魔法 [分块]【学习笔记】

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discus ...

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

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

  4. Bzoj 3343: 教主的魔法 分块,二分

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 364[Submit][Status][Discuss ...

  5. bzoj 3343 教主的魔法 分块

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

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

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

  7. BZOJ 3343教主的魔法

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

  8. bzoj 3343: 教主的魔法

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 924  Solved: 402[Submit][Status][Discuss] Descriptio ...

  9. [bzoj] 3343 教主的魔法 || 带修改分块

    原题 长度为n的序列,有两种操作: 1.[l,r]区间每个数+w 2.询问[l,r]区间有多少个数>c 记录lazy数组即可. #include<cstdio> #include&l ...

随机推荐

  1. zabbix配置企业微信报警

    +++++++++++++++++++++++++++++++++++++++++ 1. 工作中最长使用的就是微信,普及,开源,而且免费!!! 2. 在企业微信中要记录的值: · 部门id · 企业i ...

  2. 个人博客-vue-blog

    http://47.100.126.169/zmengBlog/

  3. es6种for循环中let和var区别

    let和var区别: for(var i=0;i<5;i++){ setTimeout(()=>{ console.log(i);//5个5 },100) } console.log(i) ...

  4. 四、JVM之栈与栈帧

    栈: 1.又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把 另一端称为栈底.其特性是先进后出. 2.栈是线程私有的,生命周期跟线程相同,当创 ...

  5. FileUpload的控件上传excel

    在一个使用FileUpload的控件上传excel,读取excel的数据 因为上传的路径一直被限定在C:\Program\IIS\Express 一直限制这个文件下, 想要解决这个问题. 在谷歌浏览器 ...

  6. 自定义博客cnblogs样式的必备前端小知识——css

    css样式相关小知识 文字超出一行显示省略号 overflow: hidden; /*自动隐藏文字*/ text-overflow: ellipsis; /*文字隐藏后添加省略号*/ white-sp ...

  7. gitbub 基本使用

    一.环境 git:https://git-scm.com/ 申请github账号:https://github.com/ 二.安装git 一直next即可 三.创储存建库 1.选择New reposi ...

  8. java.lang.IllegalArgumentException: clusterListener can not be null

    Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.mongodb. ...

  9. Oracle GoldenGate 19.1新特性

    1.GoldenGate 19.1 新特性概览a.支持Oracle数据库19.1 长期支持发布版本.集成Oracle GoldenGate 12.3版的最终补丁集更新.b.微服务的安全性和可管理性增强 ...

  10. maven本地添加Oracle包

    因为版权原因,Java后台连接数据库的ojdbc包并不可以用maven直接从网上下载导入,所以需要我们手动将其资源放在本地.下面是步骤: 1.找到Oracle ojdbc6包,拷贝到某备份目录2.包目 ...