题目链接  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 (主席树)的更多相关文章

  1. HDU 4866 Shooting 扫描线 + 主席树

    题意: 在二维平面的第一象限有\(n(1 \leq n \leq 10^5)\)条平行于\(x\)轴的线段,接下来有\(m\)次射击\(x \, a \, b \, c\). 每次射击会获得一定的分数 ...

  2. HDU 4866 Shooting 题解:主席树

    这题的主要的坑点就是他给你的射击目标有重合的部分,如果你向这些重合的部分射击的话要考虑两种情况: 射击目标数量 ≥ 重合数量 : 全加上 射击目标数量 ≤ 重合数量 : 只加距离*射击目标数量 然而这 ...

  3. HDU 4866 Shooting(主席树)题解

    题意:在一个射击游戏里面,游戏者可以选择地面上[1,X]的一个点射击,并且可以在这个点垂直向上射击最近的K个目标,每个目标有一个价值,价值等于它到地面的距离.游戏中有N个目标,每个目标从L覆盖到R,距 ...

  4. Sequence II HDU - 5919(主席树)

    Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...

  5. To the moon HDU - 4348 (主席树,区间修改)

    Background To The Moon is a independent game released in November 2011, it is a role-playing adventu ...

  6. Super Mario HDU - 4417 (主席树)

    Mario is world-famous plumber. His “burly” figure and amazing jumping ability reminded in our memory ...

  7. HDU 4348(主席树 标记永久化)

    题面一看就是裸的数据结构题,而且一看就知道是主席树... 一共四种操作:1:把区间[l, r]的数都加上d,并且更新时间.2:查询当前时间的区间和.3:查询历史时间的区间和.4:时光倒流到某个时间. ...

  8. HDU 3727 Jewel 主席树

    题意: 一开始有一个空序列,然后有下面四种操作: Insert x在序列尾部加入一个值为\(x\)的元素,而且保证序列中每个元素都互不相同. Query_1 s t k查询区间\([s,t]\)中第\ ...

  9. K-th occurrence HDU - 6704 (SA, 主席树)

    大意: 给定串$s$, $q$个询问$(l,r,k)$, 求子串$s[l,r]$的第$k$次出现位置. 本来是个简单签到题, 可惜比赛的时候还没学$SA$...... 好亏啊 相同的子串在$SA$中是 ...

随机推荐

  1. Spring加载配置文件的几种方法(org.springframework.beans.factory.BeanDefinitionStoreException)

    一:Spring中的几种容器都支持使用xml装配bean,包括:XmlBeanFactory ,ClassPathXmlApplicationContext ,FileSystemXmlApplica ...

  2. TCP/IP网络编程之优于select的epoll(二)

    基于epoll的回声服务端 在TCP/IP网络编程之优于select的epoll(一)这一章中,我们介绍了epoll的相关函数,接下来给出基于epoll的回声服务端示例. echo_epollserv ...

  3. leetcode 【 Insertion Sort List 】 python 实现

    题目: Sort a linked list using insertion sort. 代码:oj测试通过 Runtime: 860 ms # Definition for singly-linke ...

  4. pycharm的常用操作:设置字体主题,注释整段代码,调整格式,批量替换等

    1.调出常用工具栏 调出的结果是下面这样的: 2.调出常用工具按钮 调出的结果如下: 3. 调整主题及文字大小 ps:如果设置后没变,需要多设置几次就好了. 4. 统一后退几格调整对齐格式 选中要调整 ...

  5. editrules

    editrules    editrules是用来设置一些可用于可编辑列的colModel的额外属性的.大多数的时候是用来在提交到服务器之前验证用户的输入合法性的.比如editrules:{edith ...

  6. js判断时间是否过期

    var myDate=new Date(); myDate.setFullYear(2014,2,1); //2014年3月1日 //注意:表示月份的参数介于 0 到 11 之间.也就是说,如果希望把 ...

  7. easyui在datagrid只想选择一条

    <table class="" id="jgrid" data-options="fitColumns:true,rownumbers: tru ...

  8. Spring MVC控制器方法参数类型

    HttpServletRequest Spring会自动将 Servlet API 作为参数传过来 HttpServletResponse InputStream 相当于request.getInpu ...

  9. hihoCoder #1809 : 本题数据范围五千

    Analysis (一) 猜想:答案跟 $q_1, q_2, q_3$ 无关:考虑排列 $q$ 是 $1, 2, 3$ 的情况,此时符合要求的排列 $p$ 实际上满足: 对于任意 $i < j ...

  10. [luoguP2657] [SCOI2009]windy数(数位DP)

    传送门 f[i][j]表示位数为i,第i位为j的windy数的个数 先预处理出f数组. 求的时候先算没有前导0的答案,再算位数和给定的数相同的答案. #include <cmath> #i ...