#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 ...
随机推荐
- java指定编码的按行读写txt文件(几种读写方式的比较)
转: java指定编码的按行读写txt文件(几种读写方式的比较) 2018年10月16日 20:40:02 Handoking 阅读数:976 版权声明:本文为博主原创文章,未经博主允许不得转载. ...
- Educational Codeforces Round 55 (Rated for Div. 2) A - Vasya and Book
传送门 https://www.cnblogs.com/violet-acmer/p/10035971.html 题意: 一本书有n页,每次只能翻 d 页,问从x页到y页需要翻动几次? 注意:往前翻最 ...
- 计算机基础:计算机网络-chapter3
数据链路层,给两个相邻节点传输数据. 数据链路:物理链路+通信协议. 数据链路层使用的信道主要有点对点信道和广播信道两种. 一.点对点信道的PPP协议: 用三层模型来研究数据链路层,不管在哪一链路上的 ...
- (数学 尾0的个数) 51nod1003 阶乘后面0的数量
n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. 收起 输入 一个数N(1 <= N <= 10^9) 输出 输出0的数量 输入样例 5 ...
- linux shell变量的截取
变量的截断,经常用到的是${},##和%%几个特殊符号.假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt ,可以用${ }分别替换得到不同的值: ${file ...
- Java NIO中的Buffer 详解
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...
- 【.net】The source was not found, but some or all event logs could not be searched
1.案发现场: 注册服务的时候 2.解决方案: 用管理员身份运行CMD,再注册服务: I had to run Command Prompt with Administrator Rights.
- 设计模式---数据结构模式之职责链模式(Chain of Responsibility)
一:概念 职责链模式(CoR,Chain of Responsibility)是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连,所以被 ...
- 10.外观模式(Facade Pattern)
动机(Motivate): 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化.那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的 ...
- None.js 第五步 Buffer(缓冲区)
// 存数据,取数据; buf = Buffer.alloc(26); for (var i = 0; i < 26; i++) { buf[i] = i + 97; } console.log ...