题目链接  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. 2018年湘潭大学程序设计竞赛 E 吃货

    题目描述 作为一个标准的吃货,mostshy又打算去联建商业街觅食了.混迹于商业街已久,mostshy已经知道了商业街的所有美食与其价格,而且他给每种美食都赋予了一个美味度,美味度越高表示他越喜爱这种 ...

  2. 推荐Android几个优质的完整项目学习

    ==>来自于微信公众号==鸿洋.大家可以关注一波大神之作. 后台经常有人问我能不能推荐几个完整项目用于学习.借着周末的机会,给大家推荐几个,项目我基本都在本地运行过,并且会在文章末尾提供每个项目 ...

  3. centos使用--vsftpd配置

    目录 1 在服务器配置FTP服务 1.1 在root权限下,通过如下命令安装Vsftp(以CentOS系统为例): 1.2 在启动vsftpd服务之前,需要登录云服务器修改配置文件,禁用匿名登录. 1 ...

  4. DirectShow简单入门程序

    1.首先确认已安装过相关工具及配置环境,然后打开vs2010,新建一对话框应用程序 取名为Player_test1,然后打开菜单->项目->属性-> 添加strmmiids.lib库 ...

  5. Memcached相关内容总结

    1.Memcached常用命令总结 Memcached命令格式一般为: command 其中描述如下: 参数 描述 command 操作命令,一般为set/add/replace/get/delete ...

  6. PHP 自定义二维码生成

    环境:PHP 7.*.* ,Composer 包管理工具.QrCode 效果如下: 使用 Composer 安装 QrCode QrCode 类库基于 php 的 GD 库,用于生成任意尺寸的二维码, ...

  7. Leetcode 516.最长回文子序列

    最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1:输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 " ...

  8. 菜鸟之路——机器学习之KNN算法个人理解及Python实现

    KNN(K Nearest Neighbor) 还是先记几个关键公式 距离:一般用Euclidean distance   E(x,y)√∑(xi-yi)2 .名字这么高大上,就是初中学的两点间的距离 ...

  9. Flask-WebSocket案例

    实验1:实现初始的通信 客户端:用浏览器向服务端发送信息 服务端:首先接收浏览器发来的信息,并作出相应应答 第一步:需要导入模块: from flask import Flask,request fr ...

  10. 最简单的动态代理实例(spring基于接口代理的AOP原理)

    JDK的动态代理是基于接口的 package com.open.aop; public interface BusinessInterface {     public void processBus ...