【BZOJ 3110】 [Zjoi2013]K大数查询 整体二分+树状数组区间修改

额,只能说整体二分是一个很神奇的东西,首先既然是二分虽然加了一个整体听起来变得立马高大上起来,但是还是需要从最基本的二分思路出发才能理解。首先如果对于只有一次地查询操作的话我们很容易就可以想到二分的写法,二分权值然后加上cheak操作判断比当前大的值有多少个,然后不断缩小二分的区间直到最后l==r。类似的,在整体二分我们同样用到类似的思想,这里简单模拟一下操作过程,希望能帮组大家理解;

首先用一个p的结构体记录下所有的操作,包括类型区间及k。然后由于题目是查询第k大的,插入的数也是有可能会出现负数,所以每一个插入的操作,插入的k变成n+1-k,然后再把查询的k大变成第k小就可以巧妙的回避负数的情况。

离线处理以后就开始二分,同样是二分权值,然后对于每一个权值区间都会有且仅仅只会对这部分区间的答案造成贡献的操作(一定要好好理解这里,这里就是算法的关键所在)。例如现在我二分出了一个区间是l->mid而现在有插入操作是插入一个大于mid的值,自然无论如何对于l->mid区间是不会有贡献的所以就丢到mid+1->r区间去(类似于一个排序)。而如果对于一个查询操作,查询第5小的数是多少,而l->mid之间的值有7个那么这个答案一定不会在这个区间内同样的扔到右边去。

因此我们需要有一个能快速查询一段区间内有多少个数的数据结构,就是区间修改区间查询可以使用线段树,但是我用的树状数组所以可能不好理解,你就当做区间修改区间查询就好了</

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值