传送门:https://www.luogu.org/problemnew/show/P2801

参考:http://hzwer.com/2784.html  感觉思路无比清晰;)

ps:我在洛谷A的,BZOJ要权限;

题意:区间查询有多少个比K的数;

思路:分块,两边暴力更新与查询,中间查询是用二分计数;每次更新,如有必要,要记得重新sort(区间对应的另一个数组);

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
typedef long long ll;
const int maxn = ;
const int bmaxn = ;
ll a[maxn],b[maxn],add[bmaxn];
int n,m; int belong[maxn];
int num,l[bmaxn],r[bmaxn]; //块个数;i这块的左端;i这块的右端
int block; //块大小 void reset(int id)
{
int le = l[id],ri = r[id];
for(int i=le; i<=ri; i++)b[i] = a[i];
sort(b+le,b+ri+);
} void build()
{
block = sqrt(n);
num = n/block;if(n%block)num++;
for(int i=; i<=num; i++)
l[i]=(i-)*block+,r[i] = i * block;
r[num] = n;
for(int i=; i<=n; i++)
belong[i] = (i-)/block + ;
for(int i=; i <= num; i++)
reset(i);
} void update(int lx,int rx,ll val)
{
if(belong[lx]==belong[rx])
{
for(int i=lx;i<=rx;i++)a[i]+=val;
reset(belong[lx]);
}
else
{
int li = r[belong[lx]],ri = l[belong[rx]];
for(int i = lx; i<=li; i++)a[i]+=val;
reset(belong[lx]);
for(int i = ri; i<=rx; i++)a[i]+=val;
reset(belong[rx]);
for(int i = belong[lx] + ;i < belong[rx]; i++)add[i]+=val;
}
} ll query(int lx,int rx,ll k)
{
ll res = ;
if(belong[lx]==belong[rx])
{
for(int i=lx;i<=rx;i++)if(a[i] >= k - add[belong[lx]])res++;
}
else
{
int li = r[belong[lx]],ri = l[belong[rx]];
// cout<<li<<" "<<ri<<endl;
for(int i = lx; i <= li; i++) if(a[i] >= k-add[belong[lx]])res++;
for(int i = ri; i <= rx; i++) if(a[i] >= k-add[belong[rx]])res++;
for(int i = belong[lx] + ; i<belong[rx]; i++)
{
int le = l[i],ri = r[i];
while(le <= ri)
{
int mid = (le+ri)>>;
if(b[mid] < k - add[i])
le = mid + ;
else ri = mid - ;
}
// printf("%d\n",le);
// cout<<r[i]-le+1<<endl;
res+=r[i] - le + ;
}
}
return res;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
scanf("%lld", &a[i]);
build();
for(int i=; i<=m; i++)
{
char s[];
int x,y;
ll v;
scanf("%s%d%d%lld",s,&x,&y,&v);
if(s[]=='M')
{
update(x,y,v);
}
else
{
ll ans = query(x,y,v);
printf("%lld\n",ans);
}
}
return ;
}

BZOJ-3343教主的魔法+分块(大块排序二分)的更多相关文章

  1. BZOJ 3343: 教主的魔法(分块+二分查找)

    BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved:  ...

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

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

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

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

  4. Bzoj 3343: 教主的魔法 分块,二分

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

  5. bzoj 3343 教主的魔法 分块

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

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

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

  7. BZOJ 3343教主的魔法

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

  8. bzoj 3343: 教主的魔法

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 924  Solved: 402[Submit][Status][Discuss] Descriptio ...

  9. BZOJ 3343 教主的魔法(分块)

    题意: 有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的 思路: 分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记, 对于查询查操 ...

  10. [bzoj] 3343 教主的魔法 || 带修改分块

    原题 长度为n的序列,有两种操作: 1.[l,r]区间每个数+w 2.询问[l,r]区间有多少个数>c 记录lazy数组即可. #include<cstdio> #include&l ...

随机推荐

  1. 脱壳0-FSG壳-详细流程

    目录 @ 1 拿到当前加壳程序,用exeinfo/PeID 看一下信息 可以看出是很老的壳FSG. 分析: ​ Entry Point : 000000154,熟悉PE结构的知道,入口点(代码)揉进P ...

  2. STL 大法好

    #include <vector>  1.支持随机访问,但不支持在任意位置O(1)插入:    2.定义:  ```cpp      vector<int> a;  ```  ...

  3. 基于简单DUT的UVM验证平台的搭建(一)

    最近一个月在实习公司做回归测试,对公司的UVM平台用的比较熟练,就想着自己做一个DUT,然后搭建一个UVM验证平台. 首先,DUT是一个简单的32位的加法器,代码如下:alu.v module add ...

  4. Windows 下配置 Vagrant 环境

    Vagrant是一个基于 Ruby 的工具,用于创建和部署虚拟化开发环境.它使用 Oracle 的开源VirtualBox虚拟化系统. Vagrant 在快速搭建开发环境方面是很赞的,试想一个团队中, ...

  5. 【Java例题】2.8 解一元二次方程

    8.解一元二次方程. 输入一元二次方程的a,b,c三个系数,解一元二次方程 ax^2+bx+c=0,输出两个根 package study; import java.util.Scanner; pub ...

  6. WEB基础(一)--JSP的9个内置对象

    1.request request 对象是 javax.servlet.httpServletRequest类型的对象. 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据. ...

  7. Mybatis学习笔记之---动态sql中标签的使用

    动态Sql语句中标签的使用 (一)常用标签 1.<if> if标签通常用于WHERE语句中,通过判断参数值来决定是否使用某个查询条件, 他也经常用于UPDATE语句中判断是否更新某一个字段 ...

  8. S3C2440 移植最新5.2linux内核

    基于 移植uboot后. 1. 移植linux内核 1.1 下载源码 打开 https://www.kernel.org/ 直接肝最新的 5.2.8 下载完后,在ubuntu里解压备用. 1.2 搭建 ...

  9. 使用 php 内部web服务器

    使用 php 内部web服务器如网站目录 d:\web\index.php1.打开命令窗口,输入下列3条命令cd d:cd d:\web\index.phpphp -S localhost:80802 ...

  10. 给定n个十六进制正整数,输出它们对应的八进制数。

    问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n<=10). 接下来n行,每行一个由0~9.大写字母A~F组成的字符串,表示要转 ...