bupt 201 树状数组

本文解析了北邮2011年7月16日邀请赛G题,介绍了如何通过确定数组边界及维护0、1数量来高效解决该问题。需要注意的是,实现过程中使用long long类型以避免溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

北邮2011-7-16邀请赛G题,(bupt 201)

http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=201

 

题意:有一个数组a[],有一个对应数组c[],c[]中存0或1,定义l(i,j)==min(a|  i…j);求ans为其中所有l(i,j)<k的对数。而如果c[i]和c[j]不相等的话l(i,j)为无穷大。

两种操作:1 输出ans

          0 i 反向c[i]的值

最后思路:先求出i位置左和右最靠近它的而且a值小于k的位置,然后维护每个位置前后的0,1个数(当然了,只需要维护一个值就可以了),然后每次更新只需要加减与这个元素相关的值就可以了,这值就可以O(1)*O(lgn)算出来了。。。

无语启发思路啊。。。

注意要用longlong。。。

 

要基础扎实啊,也要多讨论啊。。。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值