#6278. 数列分块入门 2(询问区间内小于某个值 xx 的元素个数)
题目链接:https://loj.ac/problem/6278
题目大意:中文题目
具体思路:数列分块模板题,对于更新的时候,我们通过一个辅助数组来进行,对于原始的数组,我们只是用来加减,然后这个辅助数组的作用就是对每一块进行排序,当查询的时候,如果不是整块的,我们直接通过a数组来记录,对于整块的,我们直接通过排序的辅助数组进行二分查找就可以了。
注意每一次更新,除了整块的,我们都需要进行对b数组这一整块的重新赋值,因为只是部分赋值的话,b数组已经排序了,这样的话数组的下标对应的数就已经改变了。
lower_bound查询的时候, id=lower_bound(b+l[i],b+r[i]+1,tmp)-(b+l[i]);如果是需要记录小于的个数的话,直接减去b+l[i]就是个数了。
A代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn = 2e5+;
const int mod = 1e8+;
ll l[maxn],r[maxn],belong[maxn];
ll add[maxn],a[maxn],b[maxn];
int n;
void buildblock()
{
ll tmp=(ll)sqrt(n);
ll tot=n/tmp;
if(n%tmp)
tot++;
for(ll i=; i<=n; i++)
{
belong[i]=(i-)/tmp+1ll;
}
for(ll i=; i<=tot; i++)
{
l[i]=(i-)*tmp+1ll;
r[i]=i*tmp;
}
r[tot]=n;
for(ll i=; i<=tot; i++)
{
sort(b+l[i],b+r[i]+);
}
}
void init(int tmp){
for(int i=l[tmp];i<=r[tmp];i++)b[i]=a[i];
sort(b+l[tmp],b+r[tmp]+);
}
void update(ll st,ll ed,ll val)
{
if(belong[st]==belong[ed])
{
for(ll i=st; i<=ed; i++)a[i]+=val;
init(belong[st]);
return ;
}
for(ll i=st; i<=r[belong[st]]; i++)a[i]+=val;
init(belong[st]);
for(ll i=l[belong[ed]]; i<=ed; i++)a[i]+=val;
init(belong[ed]);
for(ll i=belong[st]+; i<belong[ed]; i++)
add[i]+=val;
}
ll ask(ll st,ll ed,ll val)
{
ll ans=;
if(belong[st]==belong[ed])
{
for(ll i=st; i<=ed; i++)
{
if(a[i]+add[belong[st]]<val)
ans++;
}
return ans;
}
for(ll i=st; i<=r[belong[st]]; i++)
{
ans+=(a[i]+add[belong[st]]<val?:);
}
for(ll i=l[belong[ed]]; i<=ed; i++)
{
ans+=(a[i]+add[belong[ed]]<val?:);
}
for(ll i=belong[st]+; i<belong[ed]; i++)
{
ll tmp=val-add[i];
ll id=lower_bound(b+l[i],b+r[i]+,tmp)-(b+l[i]);
ans+=id;
}
return ans;
}
int main()
{
// freopen("hqx.in","r",stdin);
scanf("%d",&n);
for(int i=; i<=n; i++)
{
scanf("%lld",&a[i]);
b[i]=a[i];
}
buildblock();
ll op,st,ed;
ll val;
while(n--)
{
scanf("%lld %lld %lld %lld",&op,&st,&ed,&val);
if(op==)
{
update(st,ed,val);
}
else if(op==)
{
printf("%lld\n",ask(st,ed,val*val));
}
}
return ;
}
#6278. 数列分块入门 2(询问区间内小于某个值 xx 的元素个数)的更多相关文章
- LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)
#6278. 数列分块入门 2 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 6 题目描述 给出 ...
- #6279. 数列分块入门 3(询问区间内小于某个值 xx 的前驱(比其小的最大元素))
题目链接:https://loj.ac/problem/6279 题目大意:中文题目 具体思路:按照上一个题的模板改就行了,但是注意在整块查找的时候的下标问题. AC代码: #include<b ...
- LibreOJ 6278. 数列分块入门 2 题解
题目链接:https://loj.ac/problem/6278 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,询问区间内小于某个值 \(x\) 的元素个数. ...
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给 ...
- LOJ #6277. 数列分块入门 1-分块(区间加法、单点查询)
#6277. 数列分块入门 1 内存限制:256 MiB时间限制:100 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6283. 数列分块入门 7-分块(区间乘法、区间加法、单点查询)
#6283. 数列分块入门 7 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 2 题目描述 给出 ...
- LOJ #6281. 数列分块入门 5-分块(区间开方、区间求和)
#6281. 数列分块入门 5 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 5 题目描述 给出 ...
- LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个 ...
- loj 数列分块入门 6 9(区间众数)
6 题意 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及单点插入,单点询问,数据随机生成. 题解 参考:http://hzwer.com/8053.html 每个块内用一个\(vecto ...
随机推荐
- Good Bye 2018 D. New Year and the Permutation Concatenation
传送门 https://www.cnblogs.com/violet-acmer/p/10201535.html 题意: 求 n 的所有全排列组成的序列中连续的 n 个数加和为 n*(n+1)/2 的 ...
- java和c#值类型和引用类型
java数据类型分为基本数据类型和引用类型 基本数据类型:int float double bool char byte 引用数据类型:string array class interfa ...
- SVN YUM安装
一,安装: yum install subversion 二,创建配置SVN仓库: 目录自定,我这是在/home下: #cd /home # mkdir svn #svnadmin create /h ...
- 转载:C++ 二维数组new
来源:http://developer.51cto.com/art/201002/183127.htm C++编程语言中有一种叫做new的二维数组,它的应用方式比较灵活,可以有多种方法来帮助我们实现一 ...
- 开源的,跨平台的.NET机器学习框架ML.NET
微软在Build 2018大会上推出的一款面向.NET开发人员的开源,跨平台机器学习框架ML.NET. ML.NET将允许.NET开发人员开发他们自己的模型,并将自定义ML集成到他们的应用程序中,而无 ...
- ubuntu 配置minicom 进行串口开发
sudo apt-get install minicom sudo minicom -s Serial port setup Save setup as d ...
- html(常用标签,标签分类),页面模板, CSS(css的三种引入方式),三种引入方式优先级
HTML 标记语言为非编程语言负责完成页面的结构 组成: 标签:被<>包裹的由字母开头,可以结合合法字符( -|数字 ),能被浏览器解析的特殊符号,标签有头有尾 指令:被<>包 ...
- 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、Git/SVN)
一. 各类概念和指令介绍 1. NVM (1). 全称:Node Version Manager,是一款针对Nodejs的版本管理工具,由于Node的版本很多,很多时候我要需要依赖多个版本,并且要求 ...
- 前端面试题整理—HTTP篇
1.常见的HTTP方法有哪些? GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器 POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用PO ...
- 自定义类使用泛型and方法使用泛型
使用泛型的自定义类,泛型可以使用任意的数据类型,在创建对象的时候确定是什么数据类型,创建对象的时候不使用泛型,那就默认是Object类型 格式: 使用泛型的自定义类 package cn.zhuobo ...