题目链接 : P2801 教主的魔法

这是第一次A分块的题

就是模板题了

每个块内排序 每个整块仅需维护整块的修改量

询问操作:

对于边缘块 直接暴力找在[l, r]内 且比给定值大的有几个

对于整块 二分查找不小于 (给定值 - 本块修改量) 的块有多少个

修改操作:

边缘块直接修改

整块在修改量标记上修改

本题细节较多 尤其是修改和询问的范围

【明明是蒟蒻不熟练。。。

附上代码:

 #include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1e6 + ;
struct Node{
int bl, id;
long long x;
}node[N];
int n, blo, q, ts;
long long atag[N];//修改量标记 bool rule1(Node a, Node b){
return a.x < b.x;
}
//把[a, b]的元素加c
void add(int a, int b, long long c){
for(int i = (node[a].bl - ) * blo + ; i <= min(b, min(n, node[a].bl * blo)); i++)
if(node[i].id >= a)
node[i].x += c;
sort(node + (node[a].bl - ) * blo + , node + min(n, node[a].bl * blo) + , rule1);
if(node[a].bl != node[b].bl)
for(int i = (node[b].bl - ) * blo + ; i <= min(n, node[b].bl * blo); i++)
if(node[i].id <= b)
node[i].x += c;
sort(node + (node[b].bl - ) * blo + , node + min(n, node[b].bl * blo) + , rule1);
for(int i = node[a].bl + ; i <= node[b].bl - ; i++)
atag[i] += c;
}
//二分查找pos块中比a大的元素个数
int find(int pos, long long a){
if(a > node[min(n, pos * blo)].x) return ;
int l = (pos - ) * blo + , r = min(n, pos * blo), mid;
while(l < r){
mid = l + ((r - l) >> );
if(node[mid].x >= a) r = mid;
else l = mid + ;
}
return min(n, pos * blo) - l + ;
}
//询问 [a, b]中大于等于c的元素个数
int query(int a, int b, long long c){
int ans = ;
for(int i = (node[a].bl - ) * blo + ; i <= min(b, min(n, node[a].bl * blo)); i++)
if(node[i].id >= a && node[i].x >= c - atag[node[a].bl])
ans++; if(node[a].bl != node[b].bl)
for(int i = (node[b].bl - ) * blo + ; i <= min(n, node[b].bl * blo); i++)
if(node[i].id <= b && node[i].x >= c - atag[node[b].bl])
ans++; for(int i = node[a].bl + ; i <= node[b].bl - ; i++)
ans += find(i, c - atag[i]);
return ans;
} int main(){
scanf("%d%d", &n, &q);
blo = sqrt(n);
for(int i = ; i <= n; i++) scanf("%d", &node[i].x);
//输入
for(int i = ; i <= n; i++){
node[i].bl = (i - ) / blo + ;
node[i].id = i;
}
for(int i = ; i <= node[n].bl; i++)
sort(node + (i - ) * blo + , node + min(n, i * blo) + , rule1);
//块的分配与块内排序
char op[];
int x, y, z;
for(int i = ; i <= q; i++){
scanf("%s%d%d%d", op, &x, &y, &z);
if(op[] == 'M') add(x, y, z);
else printf("%d\n", query(x, y, z));
}
return ;
}

LGP2801 教主的魔法的更多相关文章

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

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

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

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

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

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

  4. BZOJ3343: 教主的魔法 分块

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

  5. [BZOJ3343]教主的魔法

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

  6. 【bzoj3343】教主的魔法 分块

    [bzoj3343]教主的魔法 2014年4月26日8092 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了 ...

  7. c++之路进阶——bzoj3343(教主的魔法)

    F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  gryz2016 Logout 捐赠本站 Notice:由于本OJ ...

  8. 【分块】bzoj3343: 教主的魔法

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

  9. BZOJ 3343教主的魔法

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

随机推荐

  1. Feel Good POJ - 2796 (前缀和+单调栈)(详解)

    Bill is developing a new mathematical theory for human emotions. His recent investigations are dedic ...

  2. github导入文件操作

    建立本地仓库: 创建新仓库的指令: git init //把这个目录变成Git可以管理的仓库 git add README.md //文件添加到仓库 git add . //不但可以跟单一文件,还可以 ...

  3. Nginx Configuring HTTPS servers

    Configuring HTTPS servershttp://nginx.org/en/docs/http/configuring_https_servers.html Configuring HT ...

  4. 解决jenkins运行磁盘满的问题

    解决jenkins运行磁盘满的问题 - ling811的专栏 - CSDN博客 https://blog.csdn.net/ling811/article/details/74991899 1.自动丢 ...

  5. pip ipython启动错误 Fatal error in launcher: Unable to create process using

    完整的错误提示: C:\Users\yyy>ipython3Fatal error in launcher: Unable to create process using '"c:\u ...

  6. Java多线程6:Synchronized锁代码块(this和任意对象)

    一.Synchronized(this)锁代码块 用关键字synchronized修饰方法在有些情况下是有弊端的,若是执行该方法所需的时间比较长,线程1执行该方法的时候,线程2就必须等待.这种情况下就 ...

  7. Python自动化运维之pexpect从入门到精通

    1. 应用场景 模拟ssh, telnet远程登录, 模拟ftp文件上传 2. 安装 参考资料: <pexpect实例分析>https://www.ibm.com/developerwor ...

  8. SQL之CASE WHEN用法详解[1]

    简单CASE WHEN函数: CASE SCORE WHEN 'A' THEN '优' ELSE '不及格' END CASE SCORE WHEN 'B' THEN '良' ELSE '不及格' E ...

  9. vue組件

    組件有局部組件和全局組件,全局組件,其它的元素能夠調用. Prop父組件子組件看不大明白.

  10. 转 MySQL 日期类型详解

    MySQL 日期类型:日期格式.所占存储空间.日期范围 比较.  日期类型        存储空间       日期格式                 日期范围  ------------ ---- ...