LOJ-6279-数列分块入门3(分块, 二分)
链接:
题意:
给出一个长为 的数列,以及 个操作,操作涉及区间加法,询问区间内小于某个值 的前驱(比其小的最大元素)。
思路:
同样的分块加二分,只不过是更新值
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#include <iomanip>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
int a[MAXN];
int Rank[MAXN], Tag[MAXN];
vector<int> Vec[MAXN];
int part, n;
void Re(int pos)
{
Vec[pos].clear();
for (int i = (pos-1)*part+1;i <= pos*part;i++)
Vec[pos].push_back(a[i]);
sort(Vec[pos].begin(), Vec[pos].end());
}
void Update(int l, int r, int c)
{
for (int i = l;i <= min(Rank[l]*part, r);i++)
a[i] += c;
Re(Rank[l]);
if (Rank[l] != Rank[r])
{
for (int i = max(l, (Rank[r]-1)*part+1);i <= r;i++)
a[i] += c;
Re(Rank[r]);
}
for (int i = Rank[l]+1;i <= Rank[r]-1;i++)
{
Tag[i] += c;
}
}
int Query(int l, int r, int c)
{
int res = -1;
for (int i = l;i <= min(Rank[l]*part, r);i++)
{
if (a[i]+Tag[Rank[l]] < c)
res = max(res, a[i]+Tag[Rank[l]]);
}
if (Rank[l] != Rank[r])
{
for (int i = max((Rank[r]-1)*part+1, l);i <= r;i++)
{
if (a[i]+Tag[Rank[r]] < c)
res = max(res, a[i]+Tag[Rank[r]]);
}
}
for (int i = Rank[l]+1;i <= Rank[r]-1;i++)
{
int pos = lower_bound(Vec[i].begin(), Vec[i].end(), c-Tag[i])-Vec[i].begin();
if (pos >= 1)
res = max(res, Vec[i][pos-1]+Tag[i]);
}
return res;
}
int main()
{
scanf("%d", &n);
part = sqrt(n);
for (int i = 1;i <= n;i++)
scanf("%d", &a[i]);
for (int i = 1;i <= n;i++)
{
Rank[i] = (i-1)/part+1;
Vec[Rank[i]].push_back(a[i]);
}
for (int i = 1;i <= Rank[n];i++)
sort(Vec[i].begin(), Vec[i].end());
int op, l, r, c;
for (int i = 1;i <= n;i++)
{
scanf("%d %d %d %d", &op, &l, &r, &c);
if (op == 0)
Update(l, r, c);
else
printf("%d\n", Query(l, r, c));
}
return 0;
}
LOJ-6279-数列分块入门3(分块, 二分)的更多相关文章
- LOJ #6279. 数列分块入门 3-分块(区间加法、查询区间内小于某个值x的前驱(比其小的最大元素))
#6279. 数列分块入门 3 内存限制:256 MiB时间限制:1500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 3 题目描述 给 ...
- LOJ 6279 数列分块入门3
嗯... 题目链接:https://loj.ac/problem/6279 这道题在分块的基础上用vc数组记录,然后最后分三块,两边暴力枚举找前驱,中间lower_bound找前驱. AC代码: #i ...
- LOJ#6279. 数列分块入门 3
区间加值还是正常的操作,查找前驱的时候用lower_bound查找,然后范围所在位置的值 #include<map> #include<set> #include<cti ...
- LOJ.6284.数列分块入门8(分块)
题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...
- LibreOJ 6279 数列分块入门 3(分块+排序)
题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...
- LOJ.6281.数列分块入门5(分块 区间开方)
题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- LibreOJ 6278 数列分块入门 2(分块)
题解:非常高妙的分块,每个块对应一个桶,桶内元素全部sort过,加值时,对于零散块O(sqrt(n))暴力修改,然后暴力重构桶.对于大块直接整块加.查询时对于非完整块O(sqrt(n))暴力遍历.对 ...
- [Libre 6281] 数列分块入门 5 (分块)
水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...
随机推荐
- JAVA 内存的那些事
(转载)固然Java屏蔽了一下内存细节,但是有时候,了解一下这些常识还是有好处的,特别是一些口试,总是盯着这些玩意不放手. JVM启动以后,会分配两类内存区域,一类用于开发职员使用,比如保存一些变量, ...
- Web01_HTML
语法和规范: 1.所有的HTML文件后缀名都是以.html或者.htm结尾的,建议使用.html结尾 2.整个html文件分别由头部分<head></head>和体部分< ...
- java 接口default的判断规则
1.前言 jdk1.8中新增加了default关键字,就是在接口中可以增加默认实现. 因为改动接口所有的实现类都要改动,所以增加了default关键字后不需要修改其他类,默认给所有实现类增加了方法. ...
- python学习道路即将结束
其实今天算是失眠了,所以打算整理一下自己的学习内容了! 今天是我看视频学习的第六天,已经学习到定义类和对象了,有时候回想python这门语言真的很入门吧,各种语法比较简易能懂. 入门首选 print( ...
- mysql注入常用函数
system_user() 系统函数名 user() 用户名 current_user() 当前用户名 session_user() 连接数据库的用户名 database() 数据 ...
- USACO2.2 Preface Numbering【思维+打表】
这道题乍一看没有什么思路,细看还是没有什么思路 嗯,细看还是可以看出些什么端倪. 不能复合嵌套什么的 总结一下就只有这样3种规则: 1.IXCM最多三个同样连续 加起来2.递减:加起来 注意VLD不连 ...
- react 中 EventEmitter 事件总线机制
此机制可用于 react 中兄弟组件中的通信 npm install events -S 事件总线: // eventBus.js import {EventEmitter} from 'events ...
- 牛逼哄洪的 Java 8 Stream,性能也牛逼么?
那么,Stream API的性能到底如何呢,代码整洁的背后是否意味着性能的损耗呢?本文对Stream API的性能一探究竟. 为保证测试结果真实可信,我们将JVM运行在 -server模式下,测试数据 ...
- Office批量授权(VL)版本和激活方法
Office 2010 Office 2010中文专业增强版 32位 文件名: SW_DVD5_Office_Professional_Plus_2010w_SP1_W32_ChnSimp_CORE_ ...
- adb 打印kernel输出的log
一. linux 内核printk机制 1.1. Android内核是基于Linxu kernel的,因此其log机制也是通用的,在Android内核中使用printk函数进行Log输出.与 ...