用set维护有序序列

或许sort也可以,但这题的前驱定义是严格小于

所以要去重

然后就是记得自己打的加法tag在query的时候一定要算上

话说这题数据有点fake啊忘了查询算上自己的标记了还有70

然后还有玄学优化

块的大小从\( \sqrt x \)变成1000每个点能快300ms的样子qwq

似乎原理是减少维护的set的个数吧

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
#include <cmath>
using namespace std;
const int MAXN = 101000;
int n,sz,num,tag[MAXN],a[MAXN],belong[MAXN];
set<int> b[105];
void calbe(int n){
for(int i=1;i<=n;i++)
belong[i]=(i-1)/sz+1;
}
void reset(int x){
b[x].clear();
for(int i=(x-1)*sz+1;i<=min(x*sz,n);i++)
b[x].insert(a[i]);
}
void update(int l,int r,int w){
int xl=belong[l];
int xr=belong[r];
for(int i=l;i<=min(xl*sz,r);i++){
b[xl].erase(a[i]);
a[i]+=w;
b[xl].insert(a[i]);
}
if(xl!=xr){
for(int i=(xr-1)*sz+1;i<=r;i++){
b[xr].erase(a[i]);
a[i]+=w;
b[xr].insert(a[i]);
}
}
for(int i=xl+1;i<=xr-1;i++)
tag[i]+=w;
}
int query(int l,int r,int w){
int xl=belong[l];
int xr=belong[r];
int ans=-1;
for(int i=l;i<=min(r,xl*sz);i++)
if(a[i]<w-tag[xl]&&a[i]+tag[xl]>ans)
ans=a[i]+tag[xl];
if(xl!=xr){
for(int i=(xr-1)*sz+1;i<=r;i++)
if(a[i]<w-tag[xr]&&a[i]+tag[xr]>ans)
ans=a[i]+tag[xr];
}
for(int i=xl+1;i<=xr-1;i++){
set<int> :: iterator it=b[i].lower_bound(w-tag[i]);
if(it==b[i].begin())
continue;
it--;
if(ans<(*it+tag[i]))
ans=*it+tag[i];
}
return ans;
}
int main(){
scanf("%d",&n);
sz=1000;
calbe(n);
num=n/sz;
if(n%sz)
num++;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=num;i++){
reset(i);
}
for(int i=1;i<=n;i++){
int opt,l,r,c;
scanf("%d %d %d %d",&opt,&l,&r,&c);
if(opt==0)
update(l,r,c);
else
printf("%d\n",query(l,r,c));
}
return 0;
}

题解——loj6279 数列分块入门3 (分块)的更多相关文章

  1. LibreOJ 6277 数列分块入门 1(分块)

    题解:感谢hzwer学长和loj让本蒟蒻能够找到如此合适的入门题做. 这是一道非常标准的分块模板题,本来用打标记的线段树不知道要写多少行,但是分块只有这么几行,极其高妙. 代码如下: #include ...

  2. LibreOJ 6280 数列分块入门 4(分块区间加区间求和)

    题解:分块的区间求和比起线段树来说实在是太好写了(当然,复杂度也高)但这也是没办法的事情嘛.总之50000的数据跑了75ms左右还是挺优越的. 比起单点询问来说,区间询问和也没有复杂多少,多开一个su ...

  3. LibreOJ 6278 数列分块入门 2(分块)

     题解:非常高妙的分块,每个块对应一个桶,桶内元素全部sort过,加值时,对于零散块O(sqrt(n))暴力修改,然后暴力重构桶.对于大块直接整块加.查询时对于非完整块O(sqrt(n))暴力遍历.对 ...

  4. [Libre 6281] 数列分块入门 5 (分块)

    水一道入门分块qwq 题面:传送门 开方基本暴力.. 如果某一个区间全部都开成1或0就打上标记全部跳过就行了 因为一个数开上个四五六次就是1了所以复杂度能过233~ code: //By Menteu ...

  5. LOJ.6284.数列分块入门8(分块)

    题目链接 \(Description\) 给出一个长为n的数列,以及n个操作,操作涉及区间询问等于一个数c的元素,并将这个区间的所有元素改为c. \(Solution\) 模拟一些数据可以发现,询问后 ...

  6. LibreOJ 6281 数列分块入门 5(分块区间开方区间求和)

    题解:区间开方emmm,这马上让我想起了当时写线段树的时候,很显然,对于一个在2^31次方以内的数,开方7-8次就差不多变成一了,所以我们对于每次开方,如果块中的所有数都为一了,那么开方也没有必要了. ...

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

    题解:自然是先分一波块,把同一个块中的所有数字压到一个vector中,将每一个vector进行排序.然后对于每一次区间加,不完整的块加好后暴力重构,完整的块直接修改标记.查询时不完整的块暴力找最接近x ...

  8. LOJ.6281.数列分块入门5(分块 区间开方)

    题目链接 int内的数(也不非得是int)最多开方4.5次就变成1了,所以还不是1就暴力,是1就直接跳过. #include <cmath> #include <cstdio> ...

  9. [Libre 6282] 数列分块入门 6 (分块)

    原题:传送门 code: //By Menteur_Hxy #include<cstdio> #include<iostream> #include<algorithm& ...

随机推荐

  1. php aes128加密

    //[加密数据]AES 128 ECB模式 public function aesEncrypt($str){ $screct_key = Yii::$app->params['encryptK ...

  2. html5随机背景颜色

    <script>var colors=['red','blue','green','orange','yellow'];    function bcolor(){        var ...

  3. 最近点对HDU1007

    利用二分的方法来计算,应该是说利用分治的方法吧! 刚开始感觉时间会爆 后来发现嘎嘎居然没有 ,嗨自己算错了时间: #include <iostream> #include<cstdi ...

  4. Python - 1. Built-in Atomic Data Types

    From:http://interactivepython.org/courselib/static/pythonds/Introduction/GettingStartedwithData.html ...

  5. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  6. c# ref和out参数

    向方法传递参的时候,对应的参数通常会用实参的拷贝来初始化.就是说随便在方法内部进行怎样的修改,都不会影响作为参数传递的变量的原始值. 通过上面的例子我们可以看出来,如果一个方法的参数是引用类型,那么使 ...

  7. ELKF安装使用教程。elasticsearch+logstash+kibana+filebeta。

    近期因工作需要学习了ELKF的安装和使用.网络上的中文我看大部分也比较老版本了,我想写一下,希望能给他人带来一点帮助.小弟不才,有错位之处,还请大家原谅指点. ELKF就是:elasticsearch ...

  8. UART接口与COM口的区别

    原文地址:https://blog.csdn.net/wordwarwordwar/article/details/78883732 简单的讲:(UART与COM) 嵌入式里面说的串口,一般是指UAR ...

  9. [转载]基于 Token 的身份验证

    作者:王皓发布于:2015-08-07 22:06更新于:2015-08-07 22:07 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twit ...

  10. Linux centos7 下 svn 服务器搭建

    摘自:https://www.cnblogs.com/mymelon/p/5483215.html 鉴于在搭建时,参考网上很多资料,网上资料在有用的同时,也坑了很多人 本文的目的,也就是想让后继之人在 ...