基于双变量不等式的避免离散化的BIT维护方式

今日在做ICPC HK 2019 C题–Constructing Ranches时,题目要求在这样的式子上统计答案。

s u m [ y ] > 2 ∗ m a x ( m x [ x ] , m x [ y ] ) − s u m [ x ] + k sum[y] > 2 * max(mx[x],mx[y]) -sum[x] + k sum[y]>2max(mx[x],mx[y])sum[x]+k

由于一对 x , y x,y x,y只统计一遍答案,显然可以考虑对 m x mx mx数组进行排序,最暴力的做法是直接将 s u m sum sum m x mx mx 存在一个 p a i r pair pair 变量中,然后直接依据 m x mx mx 排序后将不等式右边的东西扔进BIT里。

这样的问题在于当 s u m sum sum m x mx mx的权值过大时,整个东西需要提前离散化,其实不算麻烦但恰巧此题卡常,而且本人不喜欢离散化。

此时我们可以考虑利用BIT来维护下标,那么值域就锐减到 m a x ( x , y ) max(x,y) max(x,y),非常舒适。

具体的做法是:

1.建立两个 p a i r pair pair变量, f i r s t first first分别是 s u m sum sum值和 m x mx mx值, s e c o n d second second则为相同的下标。

2.对 p a i r pair pair_ s u m sum sum依据 f i r s t first first从大到小进行排序,便于我们之后的二分操作。

3.遍历 p a i r pair pair_ s u m sum sum,然后:

for(int i=1;i<=tt;i++) pair_mx[pair_sum[i].second].second=i;

这样我们就成功将 p a i r pair pair_ m x mx mx s e c o n d second second值,

对应到相对应的 p a i r pair pair_ s u m sum sum的当前下标上了。

4.对 p a i r pair pair_ m x mx mx从小到大排序

然后直接遍历 p a i r pair pair_ m x mx mx,考虑 c = 2 ∗ m a x ( m x [ x ] , m x [ y ] ) − s u m [ x ] + k c = 2 * max(mx[x],mx[y]) -sum[x] + k c=2max(mx[x],mx[y])sum[x]+k

我们在 p a i r pair pair_ s u m sum sum中,二分找到最后一个值大于 c c c的下标 a n s ans ans,直接在BIT中查询 ( 1 , a n s ) (1,ans) (1,ans),然后将 p a i r m x [ i ] . s e c o n d pairmx[i].second pairmx[i].second插入进BIT即可。(这一步就是将对应在 p a i r s u m pairsum pairsum数组里的下标扔进去)

搞定了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值