LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
题目描述
给出一个长为 nn 的数列,以及 nn 个操作,操作涉及区间加法,询问区间内小于某个值 xx 的前驱(比其小的最大元素)。
输入格式
第一行输入一个数字 nn。
第二行输入 nn 个数字,第 ii 个数字为 a_iai,以空格隔开。
接下来输入 nn 行询问,每行输入四个数字 \mathrm{opt}opt、ll、rr、cc,以空格隔开。
若 \mathrm{opt} = 0opt=0,表示将位于 [l, r][l,r] 的之间的数字都加 cc。
若 \mathrm{opt} = 1opt=1,表示询问 [l, r][l,r] 中 cc 的前驱的值(不存在则输出 -1−1)。
输出格式
对于每次询问,输出一行一个数字表示答案。
样例
样例输入
4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4
样例输出
3
-1
数据范围与提示
对于 100\%100% 的数据,1 \leq n \leq 100000, -2^{31} \leq \mathrm{others}1≤n≤100000,−231≤others、\mathrm{ans} \leq 2^{31}-1ans≤231−1。
代码:
//#6279. 数列分块入门 3-区间加法,查询区间内小于某个值x的前驱(比其小的最大元素)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+; int n,m;
ll a[maxn],b[maxn],pos[maxn],tag[maxn]; void rechange(int x)
{
for(int i=(x-)*m+;i<=min(x*m,n);i++){
b[i]=a[i];
}
sort(b+(x-)*m+,b+min(x*m,n)+);
} void update(int l,int r,ll c)
{
if(pos[l]==pos[r]){
for(int i=l;i<=r;i++)
a[i]+=c;
rechange(pos[l]);
}
else{
for(int i=l;i<=pos[l]*m;i++)
a[i]+=c;
rechange(pos[l]);
for(int i=pos[l]+;i<=pos[r]-;i++)
tag[i]+=c;
for(int i=(pos[r]-)*m+;i<=r;i++)
a[i]+=c;
rechange(pos[r]);
}
} ll query(int l,int r,ll c)
{
ll ans=-;
if(pos[l]==pos[r]){
for(int i=l;i<=r;i++){
if(a[i]+tag[pos[l]]<c){
ans=max(ans,a[i]+tag[pos[l]]);
}
}
}
else{
for(int i=l;i<=pos[l]*m;i++){
if(a[i]+tag[pos[l]]<c){
ans=max(ans,a[i]+tag[pos[l]]);
}
}
for(int i=pos[l]+;i<=pos[r]-;i++){
int cnt=c-tag[i];
int ret=lower_bound(b+(i-)*m+,b+i*m+,cnt)-b-;
//cout<<ret<<" "<<(i-1)*m<<endl;
if(ret!=(i-)*m)
ans=max(ans,b[ret]+tag[i]);
}
for(int i=(pos[r]-)*m+;i<=r;i++){
if(a[i]+tag[pos[r]]<c){
ans=max(ans,a[i]+tag[pos[r]]);
}
}
}
return ans;
} int main()
{
scanf("%d",&n);
m=sqrt(n);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
pos[i]=(i-)/m+;
}
for(int i=;i<=m+;i++)
sort(b+(i-)*m+,b+min(i*m,n)+);
for(int i=;i<=n;i++){
int op,l,r;
ll c;
scanf("%d%d%d%lld",&op,&l,&r,&c);
if(op==){
update(l,r,c);
}
else{
printf("%lld\n",query(l,r,c));
}
}
} /*
10
1 3 4 2 5 7 11 3 5 1
0 1 5 1
1 1 7 2
0 3 9 1
1 4 8 7
1 1 10 6
1 3 5 3
1 5 10 7
1 6 10 6
1 2 7 4
1 2 7 5 -1
4
4
-1
6
4
-1
4
*/
LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))的更多相关文章
- #6279. 数列分块入门 3(询问区间内小于某个值 xx 的前驱(比其小的最大元素))
题目链接:https://loj.ac/problem/6279 题目大意:中文题目 具体思路:按照上一个题的模板改就行了,但是注意在整块查找的时候的下标问题. AC代码: #include<b ...
- LOJ #6280. 数列分块入门 4-分块(区间加法、区间求和)
#6280. 数列分块入门 4 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 题目描述 给出一个 ...
- LOJ #6278. 数列分块入门 2-分块(区间加法、查询区间内小于某个值x的元素个数)
#6278. 数列分块入门 2 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 6 题目描述 给出 ...
- LOJ-6279-数列分块入门3(分块, 二分)
链接: https://loj.ac/problem/6279 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的前驱(比其小的最大元素). 思路: 同样的分块加二 ...
- LOJ-6278-数列分块入门2(分块)
链接: https://loj.ac/problem/6278 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的元素个数. 思路: 分块,用vector维护每个区 ...
- LOJ.6284.数列分块入门8(分块)
题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...
- LOJ-6277-数列分块入门1(分块)
链接: https://loj.ac/problem/6277 题意: 给出一个长为 的数列,以及 个操作,操作涉及区间加法,单点查值. 思路: 线段树可以解决,用来学习分块. 分块概念就是,将序列分 ...
- 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing
[题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...
- LOJ 6279 数列分块入门3
嗯... 题目链接:https://loj.ac/problem/6279 这道题在分块的基础上用vc数组记录,然后最后分三块,两边暴力枚举找前驱,中间lower_bound找前驱. AC代码: #i ...
随机推荐
- 查看mysql binlog日志
1.使用show binlog events a.获取binlog文件列表 mysql> show binary logs; +------------------+-----------+ | ...
- 【C++对象模型】第五章 构造、解构、拷贝 语意学
1.构造语义学 C++的构造函数可能内带大量的隐藏码,因为编译器会扩充每一个构造函数,扩充程度视 class 的继承体系而定.一般而言编译器所做的扩充操作大约如下: 所有虚基类成员构造函数必须被调用, ...
- Enterprise Architect 13 : 设置默认代码环境
设置默认代码环境: Configure -> Options -> Source Code Engineering -> Default Language For Code Gene ...
- 计数排序Counting sort
注意与基数排序区分,这是两个不同的排序 计数排序的过程类似小学选班干部的过程,如某某人10票,作者9票,那某某人是班长,作者是副班长 大体分两部分,第一部分是拉选票和投票,第二部分是根据你的票数入桶 ...
- 知问前端——cookie插件
Cookie是网站用来在客户端保存识别用户的一种小文件.一般可以保存用户登录信息.购物数据信息等一系列微小信息. 一.使用cookie插件 官方网站:http://plugins.jquery.com ...
- 版本号中Snapshot的含义
Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...
- Linux 下访问Windows共享目录
5.安装cifs-utils软件包 # yum install cifs-utils 貌似可以不用安装这个包. 6.在Linux下创建一个挂载点 # mkdir /mnt/Windows 7.挂载W ...
- 【usaco-Earthquake, 2001 Open】 0-1分数规划 & 最优比率生成树
题意:给定n个点m条边,一开始这些边全都是断的,要修一些边使得n个点全部联通.修完一共可以得到F元,修一条边有成本di和时间ti,要使得 得到的钱数 / 总时间 这个比值最大. 参考资料: 红线内的内 ...
- Python3 面向对象编程
小案例: #!/usr/bin/env python # _*_ coding:utf-8 _*_ # Author:Bert import sys class Role(object): n=&qu ...
- nvidia tk1使用记录--基本环境搭建
前言 项目最开始是在X86+Nvidia(ubuntu+opencv+cuda)平台上实现,达到了期望性能,最近考虑将其移植到嵌入式平台,特别是最近nvidia出了tegra X1,基于和我们使用的g ...