块状链表

 

 

模拟

enum.exe/enum.in/enum.out

题意描述:

有一列整数,共n个。每次可以对这些整数操作,有两种操作:

1 i个到第j个整数分别加上数p

2 询问这些数中比t小的数的个数。

 

输入文件(enum.in)

第一行有两个数,nm(1<=n<=100000,m<=10,000),表示数的个数和操作数。

第二行n个整数,表示每个数的初始值。

以后m行,每行开始一个数q

q1,则后面跟三个数ij (i<=j),表示两个下标; p(-1000=p<=1000),表示修改的数。

q2,则为询问操作,后面跟一个数t

 

输出文件(enum.out):

对每个询问操作输出数列中比t小的个数。

 

输入样例:

5 3

1 2 3 4 5

2 0

1 1 5 -10

2 0

 

输出样例:

0

5

 

 


//前几天一直很衰,根据rp守恒定律,今天终于爆发了!

这个题目的变态之处是:操作2适合平衡树,操作1适合线段树,加起来之后?线段树套平衡树?

也许可以,但一定很丑!

 


曾经在学线段树的时候,看到过块状链表,那时候觉得很慢,而对于这道题,就不得不选它了.......

 

将1~ n 分为 若干个长度为trunc(sqrt(n))的“块”,然后利用线段树的lazy思想,对于修改操作,先用一个lazy数组记录,等到

查询时在统一做处理。

 

但这道题即使这样,一次查询仍然是O(n),于是可以考虑修改过程中维护每一段递增(快排就行了),查询时就可以对每一段进行二分了。

 

于是,这道题的一次修改和查询都是O(sqrt(n)*log(sqrt(n)));(真难写)

 

只要常数弄得好就可以过了@

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值