题意:支持区间加,询问区间中元素排名

维护两个域。一个域维护原序列,一个域维护快内排序序列。

每次修改后更新快内排序序列。

修改时O(sqrt(n)log(sqrt(n)))

询问时O(sqrt(n)log(sqrt(n)))

大概是这个量级吧

 #include <bits/stdc++.h>
using namespace std; int bl[],bla,a[],a0[],b[],bi[],n;
int t1,t2,t3,t4; void init() {
bla=sqrt(n);
for (int i=;i<=n;i++)
bl[i]=(i-)/bla+,
bi[i]=(i-)%bla+;
for (int l=;l<=n;l+=bla) {
for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
a[i]=a0[i];
sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
}
} void add(int l,int r,int c){
if(bl[l]==bl[r]) {
for(int i=l;i<=r;i++)
a0[i]+=c;
for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
a[i]=a0[i];
sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
}
else {
for(int i=l;i<=bl[l]*bla;i++)
a0[i]+=c;
for(int i=bl[l]*bla-bla+;i<=bl[l]*bla;i++)
a[i]=a0[i];
sort(a+bl[l]*bla-bla+,a+bl[l]*bla+);
for(int i=bl[r]*bla-bla+;i<=r;i++)
a0[i]+=c;
for(int i=bl[r]*bla-bla+;i<=bl[r]*bla;i++)
a[i]=a0[i];
sort(a+bl[r]*bla-bla+,a+bl[r]*bla+);
for(int i=bl[l]+;i<bl[r];i++)
b[i]+=c;
}
} int query(int l,int r,long long c){
int ans=;
if(bl[l]==bl[r]) {
for(int i=l;i<=r;i++)
ans+=(a0[i]<c-b[bl[l]]);
}
else {
for(int i=l;i<=bl[l]*bla;i++)
ans+=(a0[i]<c-b[bl[l]]);
for(int i=bl[r]*bla-bla+;i<=r;i++)
ans+=(a0[i]<c-b[bl[r]]);
for(int i=bl[l]+;i<bl[r];i++)
ans+=lower_bound(a+i*bla-bla+,a+i*bla+,c-b[i])-(a+i*bla-bla+);
}
return ans;
} void printblock(){
/*for(int i=1;i<=n/bla+(n%bla)?1:0;i++) {
printf("block %d : %d\n",i,b[i]);
printf(" a0: ");
for(int j=1;j<=bla;j++) printf("%d ",a0[i*bla-bla+j]);
printf("\n");
printf(" a: ");
for(int j=1;j<=bla;j++) printf("%d ",a[i*bla-bla+j]);
printf("\n");
}*/
} int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<=n;i++)
cin>>a0[i];
init();
printblock();
for(int i=;i<=n;i++) {
cin>>t1>>t2>>t3>>t4;
if(t1==){
add(t2,t3,t4);
}
else {
printf("%d\n",query(t2,t3,t4*t4));
}
printblock();
}
}

loj6278 数列分块入门题2的更多相关文章

  1. loj6277 数列分块入门题1

    裸题分块. #include <bits/stdc++.h> using namespace std; ],b[],n,m,t1,t2,t3,t4,sq; int main(){ ios: ...

  2. [LOJ6278]数列分块入门 2

    题目大意: 给你一个长度为$n(n\leq 50000)$的序列$A$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数加上$c$: 2.询问区间$[l,r]$中小于$c^2$的数的个数.思路 ...

  3. [loj6278]数列分块入门2

    做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...

  4. 题解——loj6278 数列分块入门2 (分块)

    查询小于k的值 注意lower_bound一定要减去查找的起始位置得到正确的位置 调了快两天 淦 #include <cstdio> #include <algorithm> ...

  5. 数列分块入门九题(三):LOJ6283~6285

    Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...

  6. 数列分块入门九题(二):LOJ6280~6282

    Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每 ...

  7. 数列分块入门九题(一):LOJ6277~6279

    Preface 分块,一个神奇的暴力算法.可以把很多\(O(n^2)\)的数据结构题的暴力优化到常数极小的\(O(n\sqrt n)\).当一些毒瘤题无法用线段树,主席树,平衡树,树状数组...... ...

  8. LOJ6285 数列分块入门9(分块)

    昨天对着代码看了一晚上 然后今天终于在loj上过了 数列分块入门9题撒花★,°:.☆( ̄▽ ̄)/$:.°★ . 然后相当玄学 块的大小调成\(\sqrt{n}\)会TLE,改成150就过了 啧 然后就 ...

  9. 数列分块入门1-9 By hzwer

    声明 持续更新,因为博主也是正在学习分块的知识,我很菜的,菜的抠$jio$ 写在前面 分块是个很暴力的算法,但却比暴力优秀的多,分块算法的时间复杂度一般是根号的,他的主要思想是将一个长度是$n$的数列 ...

随机推荐

  1. web渗透之XSS基本介绍

    想学XSS必须得有基本得JS知识 JS基础BOM XSS漏洞原理 XSS(Cross Site Script),全称跨站脚本攻击.它指的是攻击者往web页面或者url里插入恶意JavaScript脚本 ...

  2. 5.Android-电话拨号器详解

    之前学习了3.Android-ADT之helloworld项目结构介绍后,本章便来写个简单的电话拨号器程序. 实现的步骤如下所示: 1.创建项目 2.写layout/activity_main.xml ...

  3. Git 工作流程和Git分支管理策略

    git-flow 阮一峰大佬写的文章真不错 git-flow, github-flow, gitlab-flow 阮一峰大佬写的文章真不错

  4. 【python基础语法】OS模块处理文件绝对路径,内置的异常类型、捕获、处理(第9天课堂笔记)

    import os """ 通过文件的路径去打开文件 相对路径:相对当前的工作路径去定位文件位置 .:代表当前路径 ..:代表上一级路径(父级路径) 绝对路径:相对于电脑 ...

  5. HTML连载67-手风琴效果、2D转换模块

    一.手风琴效果 <style> *{ margin:0; padding:0; } ul{ width: 960px; height: 300px; margin:100px auto; ...

  6. springboot + mybatis 支持oracle和mysql切换含源码

    1.springboot 启动类加入bean 如下 // DatabaseIdProvider元素主要是为了支持不同的数据库@Beanpublic DatabaseIdProvider getData ...

  7. OSI七层协议大白话解读

    参考链接:https://www.cnblogs.com/zx125/p/11295985.html 国际标准化组织(ISO)制定了osi七层模型,iso规定了各种各样的协议,并且分了7层 应用层 应 ...

  8. Git 尝试

    1,下载Git 2,安装GIt 3,config : git config --global user.name "mxb" git config --global user.em ...

  9. P1339 [USACO09OCT]热浪Heat Wave(SPFA)

    -------------------------------------- 农夫约翰再显神威,双向热浪,双倍数组 (双倍大小,否则RE) ------------------------------ ...

  10. C. Long Beautiful Integer

    题目思路还是很直接,首先按要求生成字符串.如果该目标字符串小于原字符串,那么从第k位开始,找到最后一个非9的位置,++,同时如果有9,要考虑进位(一开始没有考虑WA了一次). 犯了一个错误,就是比较字 ...