[COCI 2017-2018-2]-San
san(1s64M)
游戏世界中有N个楼从左到右排列,从左到右编号为1到N,第i幢楼的高度为Hi,楼上的金币数为Gi,游戏可以从任意一个楼开始且包涵几步。每一步玩家可以从当前位置向右跳(可以跳过一些楼)但必须跳到不低于当前楼的高度的楼上。他到了楼上后,可以得到楼上的金币。他可以在跳任意步(可以是零步)后结束游戏,但是要保证收到的金币数要大于等于K,现在想知道共有多少不同的种方案满足游戏。两个方案不同是指至少有一个楼不一样的方案。
输入:
第一行两个数N (1 ≤ N ≤ 40) and K (1 ≤ K ≤ 4·10^10 )
接下来N行,每行两个正整数,第i行用Hi和Gi表示第i个楼的高度和上面的金币。 (1 ≤ Hi, Gi ≤ 109 )
输出一行一个数,表示方案总数。
In test cases worth 40% of total points, it will hold N ≤ 20.
SAMPLE TESTS
input input input
4 6
2 1
6 3
7 2
5 6
Output
3
样例1对应的方案 {1, 2, 3}, {1, 4} and {4}
对于40%的数据,n<=20
对于100%的数据,n<=40
1.n<=20
爆搜即可。
2.n<=40
solution1:暴力+剪枝。
solution2:折半搜索法。
将n拆成两半:
我们可以分别算出两个独立区间的贡献,再尝试算出由左区间到右区间的贡献。
维护树状数组(线段树)每一次二分询问答案即可。
此题中的内存限制为64MB,所以在维护时需特别注意空间。
本萌新在考试时因内存限制被卡掉10分。。。