HDU 4866 Shooting

题目链接:戳我

题目大意:

射击游戏,玩家站在 X 轴上面,即坐标是[X, 0], 有 N 个目标,每次可以射击 会击中最近的 K 个目标,目标 是平行于 X 的线段, 有M次射击机会,每次射击的得分 是 这K个目标 与 X轴的距离和,如果上一次的得分超过了 P, 那么这次得分就是翻倍。K = (a × Pre + b) % c,Pre为上次的射击得分。Pre初始为 1

求 每次 射击 的 得分

样例解释:

4 3 5 8  //分别是 N, M, X,P 即 目标的个数,射击的次数, 玩家所在 X 轴最大为 X ,即其坐标不会超过X,P 就是上面描述 ,接下来先是 N行 和 M行

1 2 6   // 分别是 L, R, D, 即线段的起始点是(1,6),终止点是(2, 6),与 X 轴距离为 6,设这个线段名字为a

2 3 3  // 分别是 L, R, D, 即线段的起始点是(2,3),终止点是(3, 3),与 X 轴距离为 3,设这个线段名字为b

2 4 7  // 分别是 L, R, D, 即线段的起始点是(2,7),终止点是(4, 7),与 X 轴距离为 7,设这个线段名字为c

1 5 2  // 分别是 L, R, D, 即线段的起始点是(1,2),终止点是(5, 2),与 X 轴距离为 2,设这个线段名字为d

2 2 1 5 // 分别是 x,a,b,c 即 本次射击的 坐标是[x, 0],因为k = (2 * 1 + 1) % 5 = 3,可以击中最近3条,故击中的是a,d,d,得分为6+2+3=11

3 1 1 10 // 此次的 k = (1 * 11 + 1) % 10 = 2,可以击中最近的2条,故击中 b,d,且上一次得分超过了 P ,得分翻倍,为(3+2)* 2 = 10

4 2 3 7 // 此次的 k = (2 * 10 + 3 ) % 7 = 2,可以击中最近的两条,因为他的坐标是[4, 0]故击中d,c,且上一次得分超过了 P ,得分翻倍,为(2 + 7 ) * 2  = 18

解题思路:

主席树

代码:

原文地址:https://www.cnblogs.com/tenlee/p/4657318.html