LGP2801 教主的魔法
题目链接 : 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 教主的魔法的更多相关文章
- BZOJ 3343: 教主的魔法 [分块]【学习笔记】
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: 526[Submit][Status][Discus ...
- 【BZOJ-3343】教主的魔法 分块
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 950 Solved: 414[Submit][Status][Discuss ...
- 【BZOJ3343】教主的魔法 分块+二分
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
- BZOJ3343: 教主的魔法 分块
2016-05-28 10:27:19 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3343 比较显然的分块题,分块后块内排序,维护整块的附 ...
- [BZOJ3343]教主的魔法
[BZOJ3343]教主的魔法 试题描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.… ...
- 【bzoj3343】教主的魔法 分块
[bzoj3343]教主的魔法 2014年4月26日8092 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了 ...
- c++之路进阶——bzoj3343(教主的魔法)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser gryz2016 Logout 捐赠本站 Notice:由于本OJ ...
- 【分块】bzoj3343: 教主的魔法
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 631 Solved: 272[Submit][Status][Discuss ...
- BZOJ 3343教主的魔法
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
随机推荐
- c++入门之再次探讨类属性
精辟博文:https://blog.csdn.net/msdnwolaile/article/details/51923859(转载,仅供学习|!)
- PHP实用代码片段(二)
1. 转换 URL:从字符串变成超链接 如果你正在开发论坛,博客或者是一个常规的表单提交,很多时候都要用户访问一个网站.使用这个函数,URL 字符串就可以自动的转换为超链接. function mak ...
- C#跨进程读取listview控件中的数据
http://www.cnblogs.com/Charltsing/p/slv32.html 欢迎交流:QQ564955427 读取标准的32位listview控件中的数据,网上已经有很多代码了.今天 ...
- Django组件之认证系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...
- PHP中多个文件包含的问题 (一)
使用require或者include来包含文件时,包含的文件的内容相对性,这个很容易搞混,所以记录一下. 这个相对性包括 __DIR__,__FILE__,$_SERVER['PHP_SELF'],$ ...
- python3 Tkinter GUI 试水
from tkinter import * #导入tkinter下所有包,用于GUI开发#窗口创建tk=Tk()cans=Canvas(tk,width=400,height=400)#定义窗口规格c ...
- C# Note30: 软件加密机制以及如何防止反编译
参考文章: C#软件license管理(简单软件注册机制) 软件加密技术和注册机制 .NET中的许可证机制--License 背景 .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间 ...
- windows环境下protobuf的java操作{编译,序列化,反序列化}
google protocol buffer的使用和原理 概况: Protocol Buffers(也就是protobuf)是谷歌的语言中立的.平台中立的.可扩展的用于序列化结构化的数据: windo ...
- 转《service worker在移动端H5项目的应用》
1. PWA和Service Worker的关系 PWA (Progressive Web Apps) 不是一项技术,也不是一个框架,我们可以把她理解为一种模式,一种通过应用一些技术将 Web App ...
- rem 自适应、整体缩放
html{ font-size: calc(100vw/7.5); } 说明: 100vw是设备的宽度,除以7.5可以让1rem的大小在iPhone6下等于100px. 若是低版本的设备不支持rem, ...