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

解题思路:

主席树

代码:

时间: 2024-10-22 12:58:54

HDU 4866 Shooting的相关文章

HDU 4866 Shooting (主席树)

题目链接  HDU 4866 题意  给定$n$条线段.每条线段平行$x$轴,离x轴的距离为$D$,覆盖的坐标范围为$[L, R]$.   现在有$m$次射击行动,每一次的射击行动可以描述为在横坐标x处找到离x轴最近的$k$条线段,   并计算这$k$个目标距离$x$轴的总和.强制在线. 对线段到$x$轴的距离离散化. 以横坐标为下标建立主席树. 应用差分思想,对于每条线段,在$L$处标记$+1$,在R+1处标记$-1$, 查询的时候在横坐标x处则查找横坐标$x$对应的主席树即可. 主席树维护两

HDU 4866 Shooting(持久化线段树)

view code//第二道持久化线段树,照着别人的代码慢慢敲,还是有点不理解 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; typedef long long ll; #define lson l,m,ls[rt] #define rson m+1,r,rs[r

HDU 4866 Shooting 题解:主席树

这题的主要的坑点就是他给你的射击目标有重合的部分,如果你向这些重合的部分射击的话要考虑两种情况: 射击目标数量 ≥ 重合数量 : 全加上 射击目标数量 ≤ 重合数量 : 只加距离*射击目标数量 然而这题的内存还是很良心的,总体比较水吧. 主要做法是按照横坐标1~x建立主席树,每棵主席树维护l,r区间的设计目标数量,以及这些数量如果全部被射击获得的分数,这些在建树的时候是很好维护的. 然后对这些线段的处理要用扫描线的思想,就(左端点)建立一个(+1)的入点,(右端点+1)的位置建立一个(-1)的出

HDU 4866:Shooting

HDU 4866:Shooting 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4866 题目大意:给出$n$条平行于$x$轴的线段,每次查询给出一个横坐标,求该位置上方的前$k$($k$随询问变化)个线段的高度之和. 主席树 代码如下: 1 #include <cstdio> 2 #include <algorithm> 3 #include <cmath> 4 #define MAX 200005 5 using n

HDU 4866 多校1 主席树+扫描线

终于是解决了这个题目了 不过不知道下一次碰到主席树到底做不做的出来,这个东西稍微难一点就不一定能做得出 离散化+扫描线式的建树,所以对于某个坐标二分找到对应的那颗主席树,即搜索出结果即可(因为是扫描线式的建树,找到对应的树之后,就知道该点上面的线段有多少条了) 其他就是普通主席树的操作了 主席树里面维护两个东西,一个就是普通的那种在该区间的节点数目,另外就是权值 #include <iostream> #include <cstdio> #include <cstring&g

图论 500题——主要为hdu/poj/zoj

转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并查集======================================[HDU]1213   How Many Tables   基础并查集★1272   小希的迷宫   基础并查集★1325&&poj1308  Is It A Tree?   基础并查集★1856   More i

HDU 2115

I Love This Game Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5965    Accepted Submission(s): 2066 Problem Description Do you like playing basketball ? If you are , you may know the NBA Skil

Hdu 1045 二分匹配

题目链接 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6282    Accepted Submission(s): 3551 Problem Description Suppose that we have a square city with straight streets. A map of a city i

hdu 4862

Jump Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 478    Accepted Submission(s): 205 Problem Description There are n*m grids, each grid contains a number, ranging from 0-9. Your initial energ