LibreOJ 6279 数列分块入门 3(分块+排序)


题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x的解,完整的块用二分查找,其实还可以用set维护,出于对最暴力AC的尊敬,我并没有这么写.照样过了.
代码如下:
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int tag[],a[],lump[];
int sz,n;
vector<int> v[]; void reset(int x)
{
v[x].clear();
for(int i=(x-)*sz+; i<=min(x*sz,n); i++)
{
v[x].push_back(a[i]);
}
sort(v[x].begin(),v[x].end());
} void add(int l,int r,int c)
{
for(int i=l; i<=min(lump[l]*sz,r); i++)
{
a[i]+=c;
}
reset(lump[l]);
if(lump[l]!=lump[r])
{
for(int i=(lump[r]-)*sz+; i<=r; i++)
{
a[i]+=c;
}
reset(lump[r]);
}
for(int i=lump[l]+; i<=lump[r]-; i++)
{
tag[i]+=c;
}
} int query(int l,int r,int x)
{
int ans=-;
for(int i=l; i<=min(lump[l]*sz,r); i++)
{
if(a[i]+tag[lump[i]]>ans&&x>a[i]+tag[lump[i]])
{
ans=a[i]+tag[lump[i]];
}
}
if(lump[l]!=lump[r])
{
for(int i=(lump[r]-)*sz+; i<=r; i++) //!!!
{
if(tag[lump[i]]+a[i]>ans&&x>a[i]+tag[lump[i]])
{
ans=a[i]+tag[lump[i]];
}
}
}
for(int i=lump[l]+; i<=lump[r]-; i++)
{
int gg=x-tag[i];
int pos=lower_bound(v[i].begin(),v[i].end(),gg)-v[i].begin();
if(pos!=)
{
int w=v[i][pos-];
if(w+tag[i]>ans&&w+tag[i]<x)
{
ans=w+tag[i];
}
} }
return ans;
} int main()
{
int opt,l,r,c;
scanf("%d",&n);
sz=sqrt(n);
for(int i=; i<=n; i++)
{
lump[i]=(i-)/sz+;
}
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
v[lump[i]].push_back(a[i]);
}
for(int i=; i<=lump[n]; i++)
{
sort(v[i].begin(),v[i].end());
}
for(int i=; i<=n; i++)
{
scanf("%d%d%d%d",&opt,&l,&r,&c);
if(!opt)
{
add(l,r,c);
}
else
{
printf("%d\n",query(l,r,c));
}
}
}
LibreOJ 6279 数列分块入门 3(分块+排序)的更多相关文章
- LibreOj 6279数列分块入门 3 练习了一下set
题目链接:https://loj.ac/problem/6279 推荐博客:https://blog.csdn.net/qq_36038511/article/details/79725027 这题区 ...
- LibreOJ 6277 数列分块入门 1(分块)
题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...
- LibreOJ 6280 数列分块入门 4(分块区间加区间求和)
题解:分块的区间求和比起线段树来说实在是太好写了(当然,复杂度也高)但这也是没办法的事情嘛.总之50000的数据跑了75ms左右还是挺优越的. 比起单点询问来说,区间询问和也没有复杂多少,多开一个su ...
- LibreOJ 6278 数列分块入门 2(分块)
题解:非常高妙的分块,每个块对应一个桶,桶内元素全部sort过,加值时,对于零散块O(sqrt(n))暴力修改,然后暴力重构桶.对于大块直接整块加.查询时对于非完整块O(sqrt(n))暴力遍历.对 ...
- LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)
题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...
- [Libre 6281] 数列分块入门 5 (分块)
水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...
- LOJ.6284.数列分块入门8(分块)
题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...
- LOJ.6281.数列分块入门5(分块 区间开方)
题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...
- [Libre 6282] 数列分块入门 6 (分块)
原题:传送门 code: //By Menteur_Hxy #include<cstdio> #include<iostream> #include<algorithm& ...
随机推荐
- SQL万能密码:' or 1='1
select name,pass from tbAdmin where name='admin' and pass='123456' 输入用户名:' or 1='1 SQL变成下面这个样子: sele ...
- juc线程池原理(二):ThreadPoolExecutor的成员变量介绍
概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...
- 复制书稿(book) (二分,贪心+dp)
复制书稿(book) 时间限制: 1 Sec 内存限制: 128 MB提交: 3 解决: 1[提交][状态][讨论版][命题人:quanxing] 题目描述 现在要把m本有顺序的书分给k个人复制( ...
- 杂项-WiFi:JotSpot
ylbtech-杂项-WiFi:JotSpot JotSpot公司成立于2003年,由曾经创建了搜索引擎Excite的Joe Kraus一手创建,曾获得了来自Mayfield和RedPoint 两家风 ...
- 使用Tomcat+Redis来实现集群部署中的Session共享问题
一.工作中因为要使用到Tomcat集群部署,此时就涉及到了Session共享问题,主要有三种解决方案: 1.使用数据库来存储Session 2.使用Cookie来存储Session 3.使用Redis ...
- 实例甜点 Unreal Engine 4迷你教程(2)之用C++改变Image小部件的颜色
完成本迷你教程之前,请前往完成以下迷你教程: ·实例甜点 Unreal Engine 4迷你教程之如何用C++将纹理绘制在UserWidget的Image小部件上: 目标:实现UMG中的此功能: 在上 ...
- Oracle linux 6.3 安装11g R2 RAC on vbox
1 安装系统 Virtual box 4.3 Oracle linux 6.3 Oracle 11g r2 Make sure "Adapter 1" is enabled, se ...
- socket粘包现象加解决办法
socket粘包现象分析与解决方案 简单远程执行命令程序开发(内容回顾) res = subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=su ...
- sql 2008 权限角色控制
Use Test --创建角色 create role rtt create user username for login username --将用户TestUser添加到TestRole角色中 ...
- canvas二进制字符下落
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3 ...