本文为线段树做法

(听说可以tarjan缩点+拓扑?

感觉差不多。。而且这样看起来方便很多

找到左端点的过程可以看作

点 -> 区间内lowerbound最小的点 -> lowerbound -> 区间内lowerbound最小的点 -> lowerbound -> ......

所以直接维护每个点lowerbound,线段树维护下就好啦

右端点同理

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 5e5 + 5;
const long long P = 1e9 + 7;
const int inf = 0x3f3f3f3f; int n, m;
long long pos[N], rad[N];
int L[N], R[N];
long long ans; struct Seg{
int lm[N << 2], rm[N << 2];
void update(int rt){
lm[rt] = min(lm[rt << 1], lm[rt << 1 | 1]);
rm[rt] = max(rm[rt << 1], rm[rt << 1 | 1]);
}
void build(int l, int r, int rt){
if(l == r){
lm[rt] = L[l], rm[rt] = R[l];
return ;
}
int mid = l + ((r - l) >> 1);
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
update(rt);
}
void qry(int l, int r, int x, int y, int& nx, int& ny, int rt){
if(l == x && r == y){
nx = min(lm[rt], nx); ny = max(rm[rt], ny); return ;
}
int mid = l + ((r - l) >> 1);
if(x <= mid) qry(l, mid, x, min(y, mid), nx, ny, rt << 1);
if(y > mid) qry(mid + 1, r, max(x, mid + 1), y, nx, ny, rt << 1 | 1);
}
}seg; inline int l_lim(int x){
return lower_bound(pos + 1, pos + x, pos[x] - rad[x]) - pos;
} inline int r_lim(int x){
return upper_bound(pos + x + 1, pos + n + 1, pos[x] + rad[x]) - pos - 1;
} int main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++i){
scanf("%lld%lld", &pos[i], &rad[i]);
}
for(int i = 1; i <= n; ++i){
L[i] = l_lim(i);
R[i] = r_lim(i);
}
seg.build(1, n, 1); ans = 0;
int x, y, nx, ny;
for(int i = 1; i <= n; ++i){
x = y = nx = ny = i;
do{
x = nx, y = ny;
nx = inf, ny = -inf; seg.qry(1, n, x, y, nx, ny, 1);
}while((nx ^ x) | (ny ^ y));
ans = (ans + 1ll * i * (y - x + 1) % P) % P;
//这里原来忘乘1ll了爆了long long
}
printf("%lld\n", ans);
return 0;
}
/*
单纯维护两边并更新不可行 可能会有折向引爆
*/

LOJ2255. 「SNOI2017」炸弹 (线段树)的更多相关文章

  1. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  2. loj #2255. 「SNOI2017」炸弹

    #2255. 「SNOI2017」炸弹 题目描述 在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iX​i​​,爆炸半径是 RiR_iR​i​​,当一个炸弹爆炸时,如果另一个炸弹所在位置 X ...

  3. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  4. bzoj5518 & loj3046 「ZJOI2019」语言 线段树合并+树链的并

    题目传送门 https://loj.ac/problem/3046 题解 首先问题就是问有多少条路径是给定的几条路径中的一条的一个子段. 先考虑链的做法. 枚举右端点 \(i\),那么求出 \(j\) ...

  5. LG1198/BZOJ1012 「JSOI2008」最大数 线段树+离线

    问题描述 LG1198 BZOJ1012 题解 我们把所有操作离线,设一共有\(n\)个插入操作. 于是提前建立\(n\)个数,全部设为\(-INF\) 接着逐个处理操作即可. \(\mathrm{C ...

  6. LOJ #2005. 「SDOI2017」相关分析 线段树维护回归直线方程

    题目描述 \(Frank\) 对天文学非常感兴趣,他经常用望远镜看星星,同时记录下它们的信息,比如亮度.颜色等等,进而估算出星星的距离,半径等等. \(Frank\) 不仅喜欢观测,还喜欢分析观测到的 ...

  7. [SNOI2017]炸弹[线段树优化建图]

    [SNOI2017]炸弹 线段树优化建图,然后跑一边tarjan把点全部缩起来,炸一次肯定是有连锁反应的所以整个连通块都一样-于是就可以发现有些是只有单向边的不能忘记更新,没了. #include & ...

  8. loj #2254. 「SNOI2017」一个简单的询问

    #2254. 「SNOI2017」一个简单的询问 题目描述 给你一个长度为 NNN 的序列 aia_ia​i​​,1≤i≤N1\leq i\leq N1≤i≤N,和 qqq 组询问,每组询问读入 l1 ...

  9. 「SNOI2017」一个简单的询问

    「SNOI2017」一个简单的询问 简单的解法 显然可以差分一下. \[get(l,r,x)\times get(l1,r1,x)=get(1,r,x) \times get(1,r1,x)-get( ...

随机推荐

  1. Day1 初步认识Python

    天气有点阴晴不定~ (截图来自----------金角大王) 1.学习了计算机概论(CPU/Memory/Disk,memory的存在是为了解决信息传输产生的时延) CPU:精简指令集(RISC)-- ...

  2. elasticsearch数据输入和输出

    Elastcisearch 是分布式的 文档 存储.它能存储和检索复杂的数据结构–序列化成为JSON文档–以 实时 的方式. 换句话说,一旦一个文档被存储在 Elasticsearch 中,它就是可以 ...

  3. js 翻牌活动效果

    直接上代码 html: <div class="index_main"> <ul class="index_card"> <li ...

  4. Error Boundaries 错误边界

    错误边界是用于捕获其子组件树 JavaScript 异常,记录错误并展示一个回退的 UI 的 React 组件,而不是整个组件树的异常.错误边界在渲染期间.生命周期方法内.以及整个组件树构造函数内捕获 ...

  5. 初步了解HTTP

    HTTP简介: HTTP:HyperText  Transfer Protocol 超文本传输协议,是因特网上使用最为广泛的一种网络传输议,是用于从万维网(www :world  wide web)服 ...

  6. laravel门面和服务提供者使用

      关于laravel门面和服务提供者使用的一点见解,门面之词,不足之处,还请多多指教. 在laravel中,我们可能需要用到自己添加的类时,可以建立一个文件夹专门存放类文件,也可以使用laravel ...

  7. Azure系列2.1.1 —— BlobContainerPermissions

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  8. [转帖]FORFILES 的简单介绍。

    FORFILES https://blog.csdn.net/sandy9919/article/details/82932460 命令格式: forfiles.exe /p "D:\备份& ...

  9. day 7 -1 进程理论知识

    一.进程的定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实 ...

  10. build/temp.linux-x86_64-2.7/_openssl.c:493:30: fatal error: openssl/opensslv.h: No such file or directory

    解决:apt-get install libssl-dev apt install python-dev(这个可能和那个错误关系不大)