博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
loj#6279. 数列分块入门 3
阅读量:5218 次
发布时间:2019-06-14

本文共 1381 字,大约阅读时间需要 4 分钟。

#6279. 数列分块入门 3

题目:

简要题意:

   给出一个长为 n 的数列,以及 n 个操作,操作涉及区间加法,询问区间内小于某个值 x 的前驱(比其小的最大元素)。

 


 

 

题解:

   有点无耻的用一波set,其实就和分块2差不多嘛,找一下大于等于该元素的数,位置减一就ok

 


 

 

代码:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 using namespace std; 9 int n,a[110000],ba[110000];10 int block,pos[110000];11 set
s[110];12 void update(int l,int r,int c)13 {14 for(int i=l;i<=min(pos[l]*block,r);i++)15 {16 s[pos[i]].erase(a[i]);17 a[i]+=c;18 s[pos[i]].insert(a[i]);19 }20 if(pos[l]!=pos[r])21 for(int i=(pos[r]-1)*block+1;i<=r;i++)22 {23 s[pos[i]].erase(a[i]);24 a[i]+=c;25 s[pos[i]].insert(a[i]);26 }27 for(int i=pos[l]+1;i<=pos[r]-1;i++)ba[i]+=c;28 }29 void sol(int l,int r,int c)30 {31 int ans=-1;32 for(int i=l;i<=min(pos[l]*block,r);i++)if(a[i]+ba[pos[i]]
::iterator it=s[i].lower_bound(x);41 if(it==s[i].begin())continue;42 it--;43 ans=max(ans,*it+ba[i]);44 }45 printf("%d\n",ans);46 }47 int main()48 {49 memset(pos,0,sizeof(pos));memset(ba,0,sizeof(ba));50 scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);51 block=1000;for(int i=1;i<=n;i++){pos[i]=(i-1)/block+1;s[pos[i]].insert(a[i]);}52 for(int i=1;i<=n;i++)53 {54 int opt,l,r,c;55 scanf("%d%d%d%d",&opt,&l,&r,&c);56 if(opt==0)update(l,r,c);57 else sol(l,r,c);58 }59 return 0;60 }

 

转载于:https://www.cnblogs.com/CHerish_OI/p/8580579.html

你可能感兴趣的文章
中国剩余定理
查看>>
基础笔记一
查看>>
uva 10137 The trip
查看>>
Count Numbers
查看>>
编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
查看>>
网卡bond技术
查看>>
UITabbarController的UITabbarItem(例:"我的")点击时,判断是否登录
查看>>
UNIX基础知识之输入和输出
查看>>
【洛谷 P1666】 前缀单词 (Trie)
查看>>
对称加密和非对称加密
查看>>
数据库锁机制及乐观锁,悲观锁的并发控制
查看>>
图像处理中双线性插值
查看>>
RobHess的SIFT代码解析之RANSAC
查看>>
03 线程池
查看>>
201771010125王瑜《面向对象程序设计(Java)》第十三周学习总结
查看>>
java中内部类的讲解
查看>>
手机验证码执行流程
查看>>
python 基础 ----- 变量
查看>>
设计模式课程 设计模式精讲 2-2 UML类图讲解
查看>>
Silverlight 的菜单控件。(不是 Toolkit的)
查看>>