【bzoj3343】教主的魔法 分块
【bzoj3343】教主的魔法
Description
Input
Output
Sample Input
1 2 3 4 5
A 1 5 4
M 3 5 1
A 1 5 4
Sample Output
3
HINT
题解
将区间分为sqrt(n)块每块排序,
修改:对于一块直接上add标记,二两端进行暴力修改
查询:对于一块用二分查找,对于单个则暴力
代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <typeinfo>
#include <map>
#include <stack>
typedef long long ll;
using namespace std;
inline ll read()
{
ll x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
}
//***************************
int b[];
int a[];
int block;
int n,m;
int add[];
int pos[];
void reset(int x){
int l=(x-)*block+;
int r=min(n,x*block);
for(int i=l;i<=r;i++)b[i]=a[i];
sort(b+l,b+r+);
}
void update(int l,int r,int w)
{
if(pos[l]==pos[r])
{
for(int i=l;i<=r;i++)a[i]=a[i]+w;
}
else {
for(int i=l;i<=pos[l]*block;i++)a[i]=a[i]+w;
for(int i=(pos[r]-)*block+;i<=r;i++)a[i]=a[i]+w;
}
reset(pos[l]);
reset(pos[r]);
for(int i=pos[l]+;i<pos[r];i++)
add[i]=add[i]+w;
}
int ask(int l,int r,int c)
{int ans=;
if(pos[l]==pos[r])
{
for(int i=l;i<=r;i++){
if(a[i]+add[pos[i]]>=c)ans++;
}
}
else {
for(int i=l;i<=pos[l]*block;i++){
if(a[i]+add[pos[i]]>=c)ans++;
// cout<<
}
for(int i=(pos[r]-)*block+;i<=r;i++)
{
if(a[i]+add[pos[i]]>=c)ans++;
}
}
// cout<<pos[l]+1<<" "<<pos[r]-1<<" fffff "<<ans<<endl;
for(int i=pos[l]+;i<pos[r];i++)
{
int j=lower_bound(b+(i-)*block+,b+min(i*block,n)+,c-add[i])-b;//cout<<j<<" ggg ";
ans+=(min(i*block,n)-j+);
}
return ans;
}
int main()
{ int q;
memset(add,,sizeof(add));
cin>>n>>q;
block=int(sqrt(n));
for(int i=;i<=n;i++){
cin>>a[i];
pos[i]=(i-)/block+;
b[i]=a[i];
}
if(n%block)m=n/block+;
else m=n/block;
for(int i=;i<=m;i++){
reset(i);
}
// for(int i=1;i<=n;i++)cout<<b[i]<<" ";
int l,r,x,c;
char ch;
for(int i=;i<=q;i++){
getchar();
cin>>ch>>l>>r>>x;
if(ch=='M'){
update(l,r,x);
}else {
cout<<ask(l,r,x)<<endl;
}
}
return ;
}
【bzoj3343】教主的魔法 分块的更多相关文章
- BZOJ3343: 教主的魔法 分块
2016-05-28 10:27:19 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3343 比较显然的分块题,分块后块内排序,维护整块的附 ...
- [bzoj3343]教主的魔法——分块
Brief description 给定一个数列,您需要支持一下两种操作: 给[l,r]同加一个数 询问[l,r]中有多少数字大于或等于v Algorithm analyse 这个题一时想不到什么有效 ...
- BZOJ-3343教主的魔法+分块(大块排序二分)
传送门:https://www.luogu.org/problemnew/show/P2801 参考:http://hzwer.com/2784.html 感觉思路无比清晰:) ps:我在洛谷A的, ...
- bzoj3343: 教主的魔法 分块 标记
修改:两边暴力重构,中间打标记.复杂度:O(n0.5) 查询:中间二分两边暴力.O(n0.5logn0.5) 总时间复杂度O(n*n0.5logn0.5) 空间复杂度是n级别的 标记不用下传因为标记不 ...
- [BZOJ3343]教主的魔法
[BZOJ3343]教主的魔法 试题描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.… ...
- Luogu 2801 教主的魔法 | 分块模板题
Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
- 【BZOJ-3343】教主的魔法 分块
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 950 Solved: 414[Submit][Status][Discuss ...
- 【BZOJ3343】教主的魔法 分块+二分
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
随机推荐
- C语言时间函数
#include "time.h" #include "stdio.h" #include "stdlib.h" int main() { ...
- Java实现Socket5代理服务器
直接贴代码,不解释 1 主服务,用来侦听端口 package org.javaren.proxy; import java.net.ServerSocket; import java.net.Sock ...
- sql server case when 判断为空
代码如下 select distinct G.* ,(select BUSINESS_NAME from BusinessInfo where BusinessInfo.BUSINESS_BID=G. ...
- [转载]angularjs学习总结 详细教程
http://blog.csdn.net/yy374864125/article/details/41349417#t75 目录(?)[-] 前言 AngularJS概述 AngularJS是什么 A ...
- matlab 之字体调整
FontWeight {normal} | bold | light | demi
- vmware, failed to lock the file
电脑死机,进不了桌面,实在不行就重启,但是在运行着虚拟机,重启后打开VMware虚拟机,提示failed to lock the file,进不去了,急阿,里面不少资料呢...问万能的Google,终 ...
- zabbix再爆高危SQL注入漏洞,可获系统权限
漏洞概述 zabbix是一个开源的企业级性能监控解决方案.近日,zabbix的jsrpc的profileIdx2参数存在insert方式的SQL注入漏洞,攻击者无需授权登陆即可登陆zabbix管理系统 ...
- MBProgressHUD使用
//方式1.直接在View上show HUD = [[MBProgressHUD showHUDAddedTo:self.view animated:YES] retain]; HUD.delegat ...
- Awvs如何扫描需要登录的部分
一个小技巧,可能部分的人习惯了按下一步.所以不大知道.给大家说说哈. 到LOGIN步骤的时候,在Login sequen 新建.然后你懂的了.会新出来一个浏览器,直接登录后一直下一步即可
- 连接池 druid(阿里巴巴的框架)
引用自:http://blog.163.com/hongwei_benbear/blog/static/1183952912013518405588/ 说的是现在最好的连接池 注: 属性跟 d ...