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$中是 ...
随机推荐
- MongoDB集群部署 - 带访问控制的分片副本集
1. 前言 Ceilometer将meter.event等数据保存在MongoDB中,之前将MongoDB部署在控制节点上,使用三副本模式,时间长了发现meter数据爆炸式增长,区区2T的磁盘捉襟见肘 ...
- JDK各版本新特性浅谈
JDK 5.0 自动拆装箱 枚举 可变参数 泛型 For -each 内省 静态导入 JDK 6.0 console开发控制台程序 轻量级HTTP ServerAPI 支持脚本语言 使用Compile ...
- mybatis特殊字符处理
在mybatis 的mapper.xml文件中特殊字符处理方式 仅供参考 出处:http://yaobenzhang.blog.163.com/blog/static/214395113201561 ...
- vue-cli 中引入 jq
vue-cli webpack 引入jquery 今天费了一下午的劲,终于在vue-cli 生成的工程中引入了jquery,记录一下.(模板用的webpack) 首先在package.json里的 ...
- export、export default、module.export区别
在es6里面定义模块,导出模块时可以使用export.export default 这2者区别: 在同一个文件里面可以有多个export, 一个文件里面只能有1个export default //a. ...
- loj2090 「ZJOI2016」旅行者
分治+最短路,很套路的 #include <algorithm> #include <iostream> #include <cstring> #include & ...
- laravel5.2总结--ORM模型
ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...
- C#入门篇6-1:字符串操作 char常用的函数
//char 字符的常见操作 public static void FChar() { //判定字符的类别 char ch1 = 'a';//使用小引号 bool bl = true; bl = ch ...
- IOS开发学习笔记012-核心语法
1.点语法 2.成员变量的作用域 3. @property和@synthesize 4.id类型 5.构造方法 6.自定义构造方法 7.模板修改 8.Category - 分类 9.类扩展 一.点语法 ...
- Monkeyrunner 录制脚本&回放
本文主要解释如何使用monkeyrunner来实现脚本的录制和回放 一:准备条件 在电脑端配置 Android SDK环境 java 环境 下载好 SDK后添加环境变量 E:\android- ...