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$中是 ...
随机推荐
- Android通过AIDL和反射调用系统拨打电话和挂断电话
首先在项目中添加ITelephony.aidl文件,我的如下: /* * Copyright (C) 2007 The Android Open Source Project * * Licensed ...
- 3 View - Request对象
1.HttpReqeust对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象 视图函数的第一个参数是HttpRequest对象 在django.http模块中定义了Htt ...
- Docker背后的内核知识(一)
Docker背后的内核知识 当谈论Docker时,常常会聊到Docker的实现方式.很多开发者都知道,Docker容器本质上是宿主机上的进程.Docker通过namespace实现了资源隔离.通过cg ...
- IOS开发学习笔记020-练习总结
自己做了一遍,现在再复习一下,总结一下. 最终效果如下 1.新建一个工程Single View Application 总体如下 不过要关闭自动布局功能 这是按下设置按钮显示的界面默认 ...
- 安恒杯月赛 babypass getshell不用英文字母和数字
BABYBYPASS 先贴代码: ①限制字符长度35个 ②不能使用英文字母和数字和 _ $ 最后提示有个getFlag()函数,从这个函数入手. 我们的第一思路是直接eval执行getFlag函数,但 ...
- 带线表格据gt生成无线表格
json解析练习,python图像处理练习,表格包围框毛刺问题待解决. # -*- coding: utf-8 -*- # coding: utf-8 from PIL import Image, I ...
- Leetcode 630.课程表III
课程表III 这里有 n 门不同的在线课程,他们按从 1 到 n 编号.每一门课程有一定的持续上课时间(课程时间)t 以及关闭时间第 d 天.一门课要持续学习 t 天直到第 d天时要完成,你将会从第 ...
- URIs, URLs, and URN
首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体 ...
- Servlet+Json代码
package com.brmoney.servlet; import java.io.IOException; import java.io.PrintWriter; import java.uti ...
- BZOJ 2015:[Noi2010]能量采集(数论+容斥原理)
2005: [Noi2010]能量采集 Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物 ...