https://www.luogu.org/problemnew/show/P2801

分块

对于每一块进行排序存储在另一个数组中

二分查询

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath> using namespace std; #define gc getchar() const int N = 1e6 + ;
const int M = 1e3 + ; int A[N], B[N], Pos[N], Add[M];
int n, Q, cnt, block; inline int read(){
int x = , f = ; char c = gc;
while(c < '' || c > '') {if(c == '-') f = -; c = gc;}
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x * f;
} inline void Sort(int x){
int l = (x - ) * block + , r = min(n, x * block);
for(int i = l; i <= r; i ++) B[i] = A[i];
sort(B + l, B + r + );
} inline void Sec_G(int x, int y, int z){
if(Pos[x] == Pos[y]){for(int i = x; i <= y; i ++) A[i] += z; Sort(Pos[x]); return ;}
else {
for(int i = x; i <= Pos[x] * block; i ++) A[i] += z;
for(int i = (Pos[y] - ) * block + ; i <= y; i ++) A[i] += z;
Sort(Pos[x]); Sort(Pos[y]);
}
for(int i = Pos[x] + ; i < Pos[y]; i ++) Add[i] += z;
} inline int to_calc(int x, int num){
int l = (x - ) * block, r = min(x * block, n), last = r, ans;
while(l <= r){
int mid = (l + r) >> ;
if(B[mid] < num) ans = mid, l = mid + ;
else r = mid - ;
}
return last - ans + ;
} inline int Sec_A(int x, int y, int z){
int answer();
if(Pos[x] == Pos[y]){for(int i = x; i <= y; i ++) if(A[i] + Add[Pos[x]] >= z) answer ++; return answer;}
else {
for(int i = x; i <= Pos[x] * block; i ++) if(A[i] + Add[Pos[x]] >= z) answer ++;
for(int i = (Pos[y] - ) * block + ; i <= y; i ++) if(A[i] + Add[Pos[y]] >= z) answer ++;
}
for(int i = Pos[x] + ; i < Pos[y]; i ++) answer += to_calc(i, z - Add[i]);
return answer;
} int main()
{
freopen("gg.in", "r", stdin);
n = read(); Q = read();
block = sqrt(n);
for(int i = ; i <= n; i ++) A[i] = read();
for(int i = ; i <= n; i ++) Pos[i] = (i - ) / block + ;
for(int i = ; i <= n; i ++) Sort(i);
if(n % block) cnt = n / block + ;
else cnt = n / block;
while(Q --){
string s; cin >> s;
int x = read(), y = read(), z = read();
if(s[] == 'A') Sec_G(x, y, z);
else cout << Sec_A(x, y, z) << endl;
} return ;
}
/*
5 3
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
*/

[Luogu] 教主的魔法的更多相关文章

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

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

  2. luogu P2801 教主的魔法

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

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

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

  4. BZOJ3343 & 洛谷2801:教主的魔法——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3343 https://www.luogu.org/problemnew/show/2801 题目描述 ...

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

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

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

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

  7. 【BZOJ-3343】教主的魔法 分块

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

  8. 【BZOJ3343】教主的魔法 分块+二分

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

  9. BZOJ3343: 教主的魔法 分块

    2016-05-28  10:27:19 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3343 比较显然的分块题,分块后块内排序,维护整块的附 ...

随机推荐

  1. matplotlib实例笔记

    下面的图型是在一幅画布上建立的四个球员相关数据的极坐标图 关于这个图的代码如下: #_*_coding:utf-8_*_ import numpy as np import matplotlib.py ...

  2. python装饰器无参及有参案例

    装饰器无参和有参案例:

  3. vs setup 自动下载依赖的framework配置

    1.项目->属性->签名->选中为ClickOnce清单签名->创建测试证书 2.项目->属性->安全性->启用ClickOnce安全设置 3.setup项目 ...

  4. apply 和 call 的用法

    apply的用法 语法 func.apply(thisArg, [argsArray]) thisArg 可选的.在func函数运行时使用的this值.请注意,this可能不是该方法看到的实际值:如果 ...

  5. git 修改注释

    原文:https://www.jianshu.com/p/098d85a58bf1 修改最后一条注释: git commit --amend 如果已经推送到远程,强制push到远程仓库: git pu ...

  6. VS.NET(C#)--2.9_HTML服务器控件案例

    HTML服务区控件案例 UI设计视图 UI源码视图 <>

  7. IO模型之NIO代码及其实践详解

    一.简介 NIO我们一般认为是New I/O(也是官方的叫法),因为它是相对于老的I/O类库新增的( JDK 1.4中的java.nio.*包中引入新的Java I/O库).但现在都称之为Non-bl ...

  8. 如何在github上提交pr

    如何在github上提交pr 1.fork开源的代码到自己的远程仓库 2.clone自己的仓库到本地电脑 3.与源代码的github仓库建立新的连接 git remote add upstream h ...

  9. java一些基本算法

    本文主要介绍一些常用的算法: 冒泡排序:两两相互之间进行比较,如果符合条件就相互兑换. //冒泡排序升序 public static int[] bubblingSortAsc(int[] array ...

  10. C++——virtual function

    无论是pure virtual还是impure virtual,都允许子类override他.但是真两种方式还是有一点差别,如果是pure virtual,那么父类是十分强烈希望子类override他 ...