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 ...
随机推荐
- java 面向对象编程(OOP)
java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改: 代码复用: 增加代码的可靠性和灵活性: 增加代码的可理解性. 封装 封装 ...
- mysql 在查询结果中进行二次查询
第一次查询:查询身份证编号和出现次数 select cardid,count(cardid) as total from p_person_info group by cardid 在第一次查询结果进 ...
- Zyan 一个通信框架
原文地址 本文示例 Zyan是一个简单直观的分布式应用程序开发框架. 以下是Zyan项目的简要概述. 架构图: Zyan一般由客户端和服务端组成.服务端(以组件的形式)提供服务,客户端远程调用服务端的 ...
- 【BZOJ】3329: Xorequ
[题意]给定方程x^3x=2x,求<=x和<=2^x的满足方程的正整数个数. [算法]数位DP,矩阵快速幂 [题解]异或相当于不进位加法. 移项得,x^2x=3x,又因为x+2x=3x,所 ...
- 【51NOD-5】1293 球与切换器
[算法]DP [题解]f[i][j][0]表示在i,j位置往下走的球数,f[i][j][1]表示在i,j位置往右走的球数,经过i,j的球若为-1则(num+1)/2往下,其余往右.+1类似. 转移见代 ...
- java分页通用篇
一.创建分页通用类 package com.dkyw.util; import java.util.List; public class Page<T> { private int tot ...
- 【Python学习笔记】有关包的基本知识
python的包(package)是一个有层次的文件目录结构.它定义了一个由模块和子包组成的Python应用程序执行环境. AAA/ __init__.py bbb.py CCC/ __init__. ...
- linux编程之信号
信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制,它用在一个或多个进程之间传递异步信号,信号可以由各种异步事件产生,如: 键盘中断等等,在Linux 的shell 中,也可以使用信 ...
- 网络知识===wireshark抓包,三次握手分析
TCP需要三次握手建立连接: 网上的三次握手讲解的太复杂抽象,尝试着使用wireshark抓包分析,得到如下数据: 整个过程分析如下: step1 client给server发送:[SYN] Seq ...
- ERROR 1682 (HY000)
ERROR 1682 (HY000) xtrabackup 恢复数据库后,出现1682错: root@localhost [(none)]>show global variables like ...