传送门(权限题)

题目分析

题意为:给定一个数列,修改和查询两种操作,修改每次给定一个区间,区间的所有元素都加上一个给定值,查询询问一段区间的数权值大于等于给定值的数有多少个。 首先对原序列分块,然后将分块后的数组每个块内的数字进行排序,这样查询时就可以暴力枚举散块,并二分枚举每个整块。对于修改,对于整块部分只需修改tag,然后暴力修改散块的原序列值,然后对散块元素所在块进行重排序即可。

code

3048 ms

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;const int N = 1e6 + 5;
int n, Q, h[N], H[N], tag[N], S, blo;
#define bug(x) cout<<#x<<":"<<x<<endl
inline int read(){int i = 0, f = 1; char ch = getchar();for(; (ch < '0' || ch > '9') && ch != '-'; ch = getchar());if(ch == '-') f = -1, ch = getchar();for(; ch >= '0' && ch <= '9'; ch = getchar())i = (i << 3) + (i << 1) + (ch - '0');return i * f;
}inline void wr(int x){if(x < 0) putchar('-'),x = -x;if(x > 9) wr(x / 10);putchar(x % 10 + '0');
}inline void add(int x, int y, int v){if(y - x + 1 <= 2 * S){for(int i = x; i <= y; i++)h[i] += v;}int Bx = x / S + (x % S ? 1 : 0), By = y / S + (y % S ? 1 : 0);int L = Bx + 1, R = By - 1;if(x == (Bx - 1) * S + 1) L--;if(y == min(n, By * S)) R++;int ans = 0;for(int i = x; i < (L - 1) * S; i++)h[i] += v;int l = (Bx - 1) * S + 1, r = min(n, Bx * S);for(int i = l; i <= r; i++)H[i] = h[i];sort(H + l, H + r + 1);for(int i = min(n, R * S) + 1; i <= y; i++)h[i] += v;l = (By - 1) * S + 1, r = min(n, By * S);for(int i = l; i <= r; i++)H[i] = h[i];sort(H + l, H + r + 1);for(int i = L; i <= R; i++)tag[i] += v;
}inline int query(int x, int y, int v){int ans = 0;if(y - x + 1 <= 2 * S){for(int i = x; i <= y; i++)if(h[i] + tag[i / S + (i % S ? 1 : 0)] >= v) ans++;return ans;}int Bx = x / S + (x % S ? 1 : 0), By = y / S + (y % S ? 1 : 0);
//    bug(Bx), bug(By);int L = Bx + 1, R = By - 1;if(x == (Bx - 1) * S + 1) L--;if(y == min(n, By * S)) R++;
//    bug(L), bug(R);for(int i = x; i <= (L - 1) * S; i++)if(h[i] + tag[Bx] >= v) ans++;for(int i = min(n, R * S) + 1; i <= y; i++)if(h[i] + tag[By] >= v) ans++;for(int i = L; i <= R; i++){int l = (i - 1) * S + 1, r = min(n, i * S), len = r - l + 1;int tmp = lower_bound(H + l, H + r + 1, v - tag[i]) - (H + l - 1);ans += len - (tmp - 1);}return ans;
}int main(){n = read(), Q = read(), S = sqrt(n), blo = n / S + (n % S ? 1 : 0);
//    bug(S);for(int i = 1; i <= n; i++) h[i] = H[i] = read();for(int i = 1; i <= blo; i++){int l = (i - 1) * S + 1, r = min(i * S, n);sort(H + l, H + r + 1);}for(int i = 1; i <= Q; i++){char opt[5]; scanf("%s", opt + 1);if(opt[1] == 'M'){int l = read(), r = read(), w = read();add(l, r, w);}else if(opt[1] == 'A'){int l = read(), r = read(), c = read();wr(query(l, r, c)), putchar('\n');}}return 0;
}

转载于:https://www.cnblogs.com/CzYoL/p/7396352.html

【bzoj3343】教主的魔法 (分块 + 二分)相关推荐

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

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

  2. [luoguP2801] 教主的魔法(二分 + 分块)

    传送门 以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的. 对于这个题,先分块,然后另开一个数组对于每个块内 ...

  3. BZOJ3343 教主的魔法 二分法+分块

    题意:给定一个数列,维护:1.[L,R]之间所有的数+=W  2.求[L,R]中大于等于C的数的数量 题解:更新用add标记,头尾俩块暴力重构:查询将每个块排序然后二分找. #include < ...

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

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

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

    题目 题目链接 题意 修改:将一个区间内所有的数+C. 查询:查询一个区间内>C的数字有多少个. 题解 很经典的分快算法题目. 将数列分块以后,对块内的元素进行排序. 当我们要做修改操作的时候: ...

  6. bzoj 3343 教主的魔法 分块

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

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

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

  8. luogu P2801 教主的魔法

    luogu P2801 教主的魔法 谜之分块 初学分块,找题练练手 大概分块示意图: 分块大法好! std: #include<bits/stdc++.h> using namespace ...

  9. C - Super Mario(分块+二分)

    C - Super Mario(分块+二分) Mario is world-famous plumber. His "burly" figure and amazing jumpi ...

最新文章

  1. no判断 python yes_python的判断 - osc_kewb5r6m的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 平均获客成本_获客成本创新高,英语流利说(LAIX.US)获客难流利
  3. method DESCRIBE failed: 401 Unauthorized
  4. 蓝桥杯:安慰奶牛(最小生成树)
  5. windows系统路径环境变量
  6. js string转number_Node.js 和 C++ 之间的类型转换
  7. P3564 [POI2014]BAR-Salad Bar(ST表 + 二分)
  8. 永远不要在 MySQL 中使用 UTF-8
  9. 在自定义HttpHandler中如何使用Session
  10. jquery函数加载及生成随机数
  11. mysql5.7循环,python3.4用循环往mysql5.7中写数据并输出的实现方法
  12. 用python开发的运维管理系统_Python运维三十六式:用Python写一个简单的监控系统...
  13. cocos2d-lua 3x 基础概念(包括场景、导演、在屏幕上显示自定义对象等)
  14. Day4:《卫报》:我们正面临着第六次大灭绝吗?
  15. java简易日历表_java简易日历代码
  16. 股指指数平稳性检验和随机性检验
  17. Android端简单数据库实现
  18. [附源码]java毕业设计校园快递管理系统
  19. Visio中图形关于轴线对称
  20. PNG图片隐写IDAT分析(3)

热门文章

  1. Spring Boot————AOP入门案例及切面优先级设置
  2. carsim中质心加速度_振动CAE分析在空调压缩机支架设计中的应用
  3. java 线程加载类_java JVM-线程上下类加载器
  4. Java反射 field
  5. 工程用计算机是什么样子的,【2人回答】学软件工程的应该买什么样的处理器电脑?-3D溜溜网...
  6. html响应式五栏布局,HTML – 响应式2列CSS布局,包括固定宽度的侧边栏?
  7. slope one 推荐算法python 代码_协同推荐算法实践之Slope One的介绍(转)
  8. react native loading动画_React高级进阶指南
  9. v8声卡怎么录制唱歌_V8声卡坑爹?想买的看完再决定,买了的看如何调试声卡...
  10. lua虚拟机字节码修改_LUA虚拟机的字节码怎么看?