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$对应的主席树即可。
主席树维护两个东西:
$s[]$表示当前维护的区间范围内的权值和。
$t[]$表示当前维护的区间范围内的权值个数。
对于那点右端点很坐标小于$x$的线段,在之前的两次插入操作中正负抵消。
于是就保证了查询到的线段横坐标范围覆盖了当前的$x$。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i) typedef long long LL; const int M = 4e6 + 10;
const int N = 2e5 + 10; struct node{
int pos, val, num;
friend bool operator < (const node &a, const node &b){
return a.pos == b.pos ? (a.val == b.val ? a.num < b.num : a.val < b.val) : (a.pos < b.pos);
}
} c[M], nd; int ls[M], rs[M], tree[N], val[N], t[M], tot;
int cnt, now, k, x, m, n, et, p;
LL s[M], pre, ans; void ins(int l, int r, int vl, int fl, int pre, int &x){
x = ++tot;
ls[x] = ls[pre];
rs[x] = rs[pre]; s[x] = s[pre] + fl * val[vl];
t[x] = t[pre] + fl; if (l == r) return; int mid = (l + r) >> 1;
if (vl <= mid) ins(l, mid, vl, fl, ls[pre], ls[x]);
else ins(mid + 1, r, vl, fl, rs[pre], rs[x]);
} LL query(int id, int l, int r, int k){
if (l == r) return 1ll * k * val[l]; int mid = (l + r) >> 1; if (t[ls[id]] > k) return query(ls[id], l, mid, k);
else if (t[ls[id]] == k) return s[ls[id]];
else return s[ls[id]] + query(rs[id], mid + 1, r, k - t[ls[id]]);
} int main(){ while (~scanf("%d%d%d%d", &n, &m, &x, &p)){
et = 0;
rep(i, 1, n){
int l, r, d;
scanf("%d%d%d", &l, &r, &d);
val[i] = d;
++et;
c[et].pos = l;
c[et].val = d;
c[et].num = 1;
++et;
c[et].pos = r + 1;
c[et].val = d;
c[et].num = -1;
} sort(val + 1, val + n + 1);
cnt = unique(val + 1, val + n + 1) - val - 1; now = 0; rep(i, 1, n << 1) c[i].val = lower_bound(val + 1, val + cnt + 1, c[i].val) - val;
sort(c + 1, c + 2 * n + 1);
tree[0] = ls[0] = rs[0] = s[0] = t[0] = tot = 0; pre = 1;
now = 0; rep(i, 1, 2 * n) ins(1, cnt, c[i].val, c[i].num, tree[i - 1], tree[i]);
rep(i, 1, m){
LL pos, a, b, cc;
scanf("%lld%lld%lld%lld", &pos, &a, &b, &cc);
k = (a * pre + b) % cc; nd.pos = pos;
nd.val = 1e9; int y = upper_bound(c + 1, c + 2 * n + 1, nd) - c - 1;
ans = query(tree[y], 1, cnt, k); if (pre > p) ans *= 2;
pre = ans; printf("%lld\n", ans);
} }
return 0;
}
HDU 4866 Shooting (主席树)的更多相关文章
- HDU 4866 Shooting 扫描线 + 主席树
题意: 在二维平面的第一象限有\(n(1 \leq n \leq 10^5)\)条平行于\(x\)轴的线段,接下来有\(m\)次射击\(x \, a \, b \, c\). 每次射击会获得一定的分数 ...
- HDU 4866 Shooting 题解:主席树
这题的主要的坑点就是他给你的射击目标有重合的部分,如果你向这些重合的部分射击的话要考虑两种情况: 射击目标数量 ≥ 重合数量 : 全加上 射击目标数量 ≤ 重合数量 : 只加距离*射击目标数量 然而这 ...
- HDU 4866 Shooting(主席树)题解
题意:在一个射击游戏里面,游戏者可以选择地面上[1,X]的一个点射击,并且可以在这个点垂直向上射击最近的K个目标,每个目标有一个价值,价值等于它到地面的距离.游戏中有N个目标,每个目标从L覆盖到R,距 ...
- Sequence II HDU - 5919(主席树)
Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...
- To the moon HDU - 4348 (主席树,区间修改)
Background To The Moon is a independent game released in November 2011, it is a role-playing adventu ...
- Super Mario HDU - 4417 (主席树)
Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory ...
- HDU 4348(主席树 标记永久化)
题面一看就是裸的数据结构题,而且一看就知道是主席树... 一共四种操作:1:把区间[l, r]的数都加上d,并且更新时间.2:查询当前时间的区间和.3:查询历史时间的区间和.4:时光倒流到某个时间. ...
- HDU 3727 Jewel 主席树
题意: 一开始有一个空序列,然后有下面四种操作: Insert x在序列尾部加入一个值为\(x\)的元素,而且保证序列中每个元素都互不相同. Query_1 s t k查询区间\([s,t]\)中第\ ...
- K-th occurrence HDU - 6704 (SA, 主席树)
大意: 给定串$s$, $q$个询问$(l,r,k)$, 求子串$s[l,r]$的第$k$次出现位置. 本来是个简单签到题, 可惜比赛的时候还没学$SA$...... 好亏啊 相同的子串在$SA$中是 ...
随机推荐
- JVM——Java类加载机制总结
)解析:解析阶段是把虚拟机中常量池的符号引用替换为直接引用的过程. 2.3 初始化 类初始化时类加载的最后一步,前面除了加载阶段用户可以通过自定义类加载器参与以外,其余都是虚拟机主导和控制.到了初始化 ...
- Redis实现之RDB持久化(二)
RDB文件结构 在Redis实现之RDB持久化(一)这一章中,我们介绍了Redis服务器保存和载入RDB文件的方法,在这一节,我们将对RDB文件本身进行介绍,并详细说明文件各个部分的结构和意义.图1- ...
- itchat 动态注册
动态注册时可以选择将itchat.run()放入另一线程或使用configured_reply()方法处理消息. 两种方法分别是: # 使用另一线程,但注意不要让程序运行终止 import threa ...
- 介绍 Active Directory 域服务 (AD DS) 虚拟化
TechNet 库 Windows Server Windows Server 2012 R2 和 Windows Server 2012 服务器角色和技术 Active Directory Acti ...
- importlib模块和split的结合使用
1.给定一个文件结构,在main.py中于运用importlib 导入a.py运行其中的show()方法 ├── clazz │ ├── __init__.py │ ├── a.py │ └── b. ...
- poj 2251 Dungeon Master 3维bfs(水水)
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 21230 Accepted: 8261 D ...
- php+mysqli预处理技术实现添加、修改及删除多条数据的方法
本文实例讲述了php+mysqli预处理技术实现添加.修改及删除多条数据的方法.分享给大家供大家参考.具体分析如下: 首先来说说为什么要有预处理(预编译)技术?举个例子:假设要向数据库添加100个用户 ...
- iOS-文本段落样式NSMutableParagraphStyle与NSParagraphStyle的使用和一些富文本处理属性
开发过程中,经常会遇到动态计算行高的问题, - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)op ...
- 山贼集团 (group)
山贼集团 (group) 题目描述 某山贼集团在绿荫村拥有强大的势力,整个绿荫村由N个连通的小村落组成,并且保证对于每两个小村落有且仅有一条简单路径相连.小村落用阿拉伯数字编号为1,2,3,4,-,n ...
- [暑假集训--数论]hdu2136 Largest prime factor
Everybody knows any number can be combined by the prime number. Now, your task is telling me what po ...