题意:

有一个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. 【Javascript函数】节流throttle和间隔控制dbounce

    一.throttle 函数节流,指把很小时间内触发的N多事件,节流成1个事件. 我们这里说的throttle就是函数节流的意思.再说的通俗一点就是函数调用的频度控制器,是连续执行时间间隔控制.主要应用 ...

  2. 76.纯 CSS 创作一组单元素办公用品

    原文地址:https://segmentfault.com/a/1190000015607676 学习后效果地址:https://scrimba.com/c/c8PQ3PTB 感想:利用css的制图. ...

  3. Spirng Boot2 系列教程(二十二)| 启动原理

    一个读者,也是我的好朋友投稿的一篇关于 SpringBoot 启动原理的文章,才大二就如此优秀,未来可期. 我一直想了解一下 SpirngBoot 的是如何启动的,我想就来写一篇关于 SpirngBo ...

  4. 解决el-tree lazy懒加载时,连续勾选前两个子节点后第二次进入默认选中时,将父节点也勾选的问题

    在用到el-tree的懒加载和默认勾选功能时,若第一次勾选前几个连续节点,第二次进入默认勾选时,由于el-tree子节点尚未完全加载(只加载出来前几个),默认勾选已经开始(已加载出来的子节点被默认勾选 ...

  5. Nginx代理服务——正向代理

    正向代理 在/opt/app/code的目录下创建一个joy.html文件 <html> <head> <meta charset="utf-8"&g ...

  6. StampedLock的理解和使用

    StampedLock介绍 StampedLock是为了优化可重入读写锁性能的一个锁实现工具,jdk8开始引入 相比于普通的ReentranReadWriteLock主要多了一种乐观读的功能 在API ...

  7. pyautogui介绍

    https://pyautogui.readthedocs.io/en/latest/introduction.html Introduction Purpose The purpose of PyA ...

  8. GP工作室—系统设计

    团队作业第二次作业--系统设计 问题 答案 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 团队名称 GP工作室 这个作业的目标 对项目软件进行更为详细的系统性设计 按照本游戏的设计要求 ...

  9. 深入Node模块Buffer-学会操作二进制

    Buffer 作为 nodejs 中重要的概念和功能,为开发者提供了操作二进制的能力.本文记录了几个问题,来加深对 Buffer 的理解和使用: 认识缓冲器 如何申请堆外内存 如何计算字节长度 如何计 ...

  10. [HNOI2008]GT考试(kmp,dp,矩阵乘法)

    [HNOI2008]GT考试(luogu) Description 求有多少个n位的数字串不包含m位的字符串(范围 n <= 1e9 n<=1e9, m <= 20m<=20) ...