loj6278 数列分块入门题2
题意:支持区间加,询问区间中元素排名
维护两个域。一个域维护原序列,一个域维护快内排序序列。
每次修改后更新快内排序序列。
修改时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的更多相关文章
- loj6277 数列分块入门题1
裸题分块. #include <bits/stdc++.h> using namespace std; ],b[],n,m,t1,t2,t3,t4,sq; int main(){ ios: ...
- [LOJ6278]数列分块入门 2
题目大意: 给你一个长度为$n(n\leq 50000)$的序列$A$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数加上$c$: 2.询问区间$[l,r]$中小于$c^2$的数的个数.思路 ...
- [loj6278]数列分块入门2
做法1 以$K$为块大小分块,并对每一个块再维护一个排序后的结果,预处理复杂度为$o(n\log K )$ 区间修改时将整块打上标记,散块暴力修改并归并排序,单次复杂度为$o(\frac{n}{K}+ ...
- 题解——loj6278 数列分块入门2 (分块)
查询小于k的值 注意lower_bound一定要减去查找的起始位置得到正确的位置 调了快两天 淦 #include <cstdio> #include <algorithm> ...
- 数列分块入门九题(三):LOJ6283~6285
Preface 最后一题我一直觉得用莫队是最好的. 数列分块入门 7--区间乘法,区间加法,单点询问 还是很简单的吧,比起数列分块入门 7就多了个区间乘. 类似于线段树,由于乘法的优先级高于加法,因此 ...
- 数列分块入门九题(二):LOJ6280~6282
Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每 ...
- 数列分块入门九题(一):LOJ6277~6279
Preface 分块,一个神奇的暴力算法.可以把很多\(O(n^2)\)的数据结构题的暴力优化到常数极小的\(O(n\sqrt n)\).当一些毒瘤题无法用线段树,主席树,平衡树,树状数组...... ...
- LOJ6285 数列分块入门9(分块)
昨天对着代码看了一晚上 然后今天终于在loj上过了 数列分块入门9题撒花★,°:.☆( ̄▽ ̄)/$:.°★ . 然后相当玄学 块的大小调成\(\sqrt{n}\)会TLE,改成150就过了 啧 然后就 ...
- 数列分块入门1-9 By hzwer
声明 持续更新,因为博主也是正在学习分块的知识,我很菜的,菜的抠$jio$ 写在前面 分块是个很暴力的算法,但却比暴力优秀的多,分块算法的时间复杂度一般是根号的,他的主要思想是将一个长度是$n$的数列 ...
随机推荐
- C# 数据类型详解以及变量、对象与内存
学习刘铁猛老师<C#语言入门详解>视频,针对其中重点知识点进行总结. 1.什么是类型? 类型又称为数据类型(Data Type),数据类型在数据结构中的定义是一个值的集合以及定义在这个值集 ...
- JS数组方法(ES5、ES6)
1. arr.push() 从后面添加元素,添加一个或多个,返回值为添加完后的数组长度 let arr = [1,2,3,4,5] console.log(arr.push(6,7)) // 7 3 ...
- 学习了解CSS3发展方向和CSS样式与优先级
通过学习CSS3游戏介绍.CSS样式和优先级章节,了解到html5+css3+js不光可以实现动画,其次可以往这个游戏与建模方向发展,更多css3特效访问Gerard Ferrandez on Cod ...
- Python——捕获异常
一.什么是异常 """异常:错误,bug处理异常:尝试执行某句可能出现异常的语句, 若出错则用正确的代码去替代. try: 可能发生错误的代码except: 如果出现异常 ...
- 阿里妈妈的iconfont的引用问题
一.先进官网 我们看到了上面的这些图标,是不是很心动,阿里妈妈就是给力,给马老师点赞,但是问题来了我们怎么去使用呢. 二.点击图标 嘿嘿,上面的操作步骤我就不多说了吧,我相信大家都会做的,接下来我们就 ...
- 【redis】基于redis实现分布式并发锁
基于redis实现分布式并发锁(注解实现) 说明 前提, 应用服务是分布式或多服务, 而这些"多"有共同的"redis"; (2017-12-04) 笑哭, 写 ...
- win2012 挂载硬盘即增加新硬盘方法
这篇文章主要介绍了win2012 挂载硬盘即增加新硬盘方法,需要的朋友可以参考下 点击左下角的服务器管理图标 点击右上角的“工具”,再选择“计算机管理” 再点击“磁盘管理” 在磁盘1的按钮处单击右键, ...
- 清北学堂—2020.1提高储备营—Day 2 afternoon(线段树、树状数组)
qbxt Day 2 afternoon --2020.1.18 济南 主讲:李佳实 目录一览 1.线段树 2.二叉搜索树(略过) 3.树状数组 总知识点:基础数据结构(本人初学感觉好难) 一.线段树 ...
- VS GIT 使用入门---我只是搬运工
网上资料推荐 GitHub 新手详细教程 - Hanani_Jia的博客 - CSDN博客 https://blog.csdn.net/Hanani_Jia/article/details/77950 ...
- 剑指offer-面试题36-二叉搜索树与双向链表-中序遍历
/* 题目: 将二叉搜索树转化为排序的双向链表,不能创建新的节点, 只能调整节点的指向,返回双向链表的头节点. */ /* 思路: 递归. 二叉搜索树的中序遍历得到的序列是递增序列. 左子树left& ...