• 题意:P5024
  • 思路:首先\(O(n^2)\)向能炸到的点连边,所以能到达的点的个数就是能到达的点的个数。然后显然要缩点+拓扑排序(我写的记搜)。

    然后再写一个线段树优化建图。

    然后就WA了,我想了很久才明白我的记搜有问题,一个点可能用来更新另一个点多次。我看了下题解,题解很nice,也很好写,就维护一个联通分量能到的范围[左右端点](此题的性质保证能到的点集是一个子段)。
  • 代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e6+5;
const int M=4e7+5;
struct seg {int l,r;}T[N];
struct node {ll p,r;}a[N];
bool cmp(node u,node v) {return u.p<v.p;}
bool In_s[N];
ll sum[N],mod=1e9+7,mp[N],cnt[N],ans[N];
int L[N],R[N],mx[N],mn[N],r[N],o[N],tim,Ecnt,In[N],Bl[N],mark[N],SCC,mxx,lf[N],Time,low[N],dfn[N],st[N],tp,n,nxt[M],to[M],head[N],ecnt;
void add_edge(int u,int v) {nxt[++ecnt]=head[u];to[ecnt]=v;head[u]=ecnt;}
void Build(int x,int l,int r) {
T[x]=(seg){l,r},mxx=max(mxx,x);
if(l==r) {lf[l]=x,mark[x]=l;return;}
int mid=(l+r)>>1,ls=x<<1,rs=x<<1|1;
add_edge(x,ls),add_edge(x,rs);
Build(ls,l,mid),Build(rs,mid+1,r);
}
void Add(int x,int u,int l,int r) {
if(l<=T[x].l&&T[x].r<=r) {add_edge(lf[u],x);return;}
int mid=(T[x].l+T[x].r)>>1;
if(l<=mid)Add(x<<1,u,l,r);
if(r>mid)Add(x<<1|1,u,l,r);
}
void Tarjan(int u) {
dfn[u]=low[u]=++Time,In_s[u]=1;
st[++tp]=u;
for(int i=head[u];i;i=nxt[i]) {
int v=to[i];
if(!dfn[v]) {
Tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(In_s[v]) low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]) {
int v;
SCC++;
L[SCC]=1e9;
do {
v=st[tp--],L[SCC]=min(L[SCC],T[v].l),R[SCC]=max(R[SCC],T[v].r),sum[SCC]+=mark[v],Bl[v]=SCC,In_s[v]=0;
}while(u!=v);
}
}
vector<int> G[N];
void dfs(int u) {
if(ans[u]) return;
ans[u]=1;
for(int i=0;i<G[u].size();i++) {
int v=G[u][i];
dfs(v);
L[u]=min(L[v],L[u]),R[u]=max(R[u],R[v]);
}
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%lld%lld",&a[i].p,&a[i].r);
}
Build(1,1,n);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) mp[i]=a[i].p;
for(int i=1;i<=n;i++) {
int l=lower_bound(mp+1,mp+1+i,a[i].p-a[i].r)-mp;
int r=upper_bound(mp+1+i,mp+1+n,a[i].p+a[i].r)-mp-1;
Add(1,i,l,r);
}
Tarjan(1);
n=mxx;
for(int u=1;u<=n;u++) {
for(int i=head[u];i;i=nxt[i]) {
int v=to[i];
if(Bl[u]!=Bl[v])G[Bl[u]].push_back(Bl[v]),In[Bl[v]]++;
}
}
for(int i=1;i<=SCC;i++) {
if(!ans[i]&&!In[i]) {
dfs(i);
}
}
ll res=0;
for(int i=1;i<=SCC;i++) {
// printf("%d %d\n",L[i],R[i]);
res=(res+1ll*sum[i]%mod*(R[i]-L[i]+1)%mod)%mod;
}
printf("%lld",res);
return 0;
}

【SNOI2017 DAY1】炸弹的更多相关文章

  1. loj #2255. 「SNOI2017」炸弹

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

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

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

  3. BSOJ 5603 -- 【SNOI2017】炸弹

    题好数据水系列,网上的十几行神仙解法A了原数据. 这道题要用到线段数优化建图的知识.然而考试考到这道题时我还不会. 我们设分别表示每个炸弹向左和向右最远能炸到哪个炸弹.很容易想到一个思路,就是每个炸弹 ...

  4. 【SNOI2017】炸弹

    题目大意 在一条直线上有\(N\)个炸弹,每个炸弹的坐标是\(X_i\),爆炸半径是 \(R_i\), 当一个炸弹爆炸时,如果另一个炸弹所在位置\(X_j\)满足: $ X_i-R_i\leq X_j ...

  5. LOJ2255. 「SNOI2017」炸弹 (线段树)

    本文为线段树做法 (听说可以tarjan缩点+拓扑? 感觉差不多..而且这样看起来方便很多 找到左端点的过程可以看作 点 -> 区间内lowerbound最小的点 -> lowerboun ...

  6. 2.26NK周赛

    这场打的很烂,说明我对组合数学的掌握(二项式定理,以及递推式的思考方向)都不太好.而且,我做题的思路也很有问题.就是完全凭借灵感,自己没有脑子一样思路就被题目带跑了,根本跳不出来,看到题目也不会分析, ...

  7. [bzoj5017][Snoi2017]炸弹 tarjan缩点+线段树优化建图+拓扑

    5017: [Snoi2017]炸弹 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 608  Solved: 190[Submit][Status][ ...

  8. [LOJ#2255][BZOJ5017][Snoi2017]炸弹

    [LOJ#2255][BZOJ5017][Snoi2017]炸弹 试题描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: ...

  9. BZOJ5017题解SNOI2017炸弹--玄学递推

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5017 分析 老师讲课谈到了这道题,课上想出了个连边建图然后乱搞的操作,被老师钦定的递推方 ...

随机推荐

  1. Canvas 核心技术

    最近项目需求中要写较多H5小游戏,游戏本身体量不是很复杂,主要是承载较多业务逻辑,所以决定用canvas来完成游戏部分.之前只是知道H5中有canvas这个东西,也知道它大概是画图的,但具体怎么用,还 ...

  2. 安卓性能优化之计算apk启动时间

    之前有人在知乎提问:"怎么计算apk的启动时间?" : 利用Python或者直接用adb命令怎么计算apk的启动时间呢?就是计算从点击图标到apk完全启动所花费的时间.比如,对游戏 ...

  3. 解决vue安装时出现vue --version或vue不是内部命令的问题

    1. 试图全局配置 vue 的环境变量,找到 vue.cmd 的路径,然后进行配置. 问题:在文件搜索中,没有找到 vue.cmd,失败. 1.npm i npm -g 全局 update 了 npm ...

  4. [MySQL]IP处理函数inet_aton()和inet_ntoa()

    INET_ATON(expr) 给出一个作为字符串的网络地址的"点地址"(如127.0.0.1)表示,返回一个代表该地址数值的整数.地址可以是4或8比特地址. mysql> ...

  5. 剖析虚幻渲染体系(14)- 延展篇:现代渲染引擎演变史Part 1(萌芽期)

    目录 14.1 本篇概述 14.1.1 游戏引擎简介 14.1.2 游戏引擎模块 14.1.3 游戏引擎列表 14.1.3.1 Unreal Engine 14.1.3.2 Unity 14.1.3. ...

  6. ethool的使用

    ethtool命令 网络配置 ethtool命令用于获取以太网卡的配置信息,或者修改这些配置.这个命令比较复杂,功能特别多 语法 ethtool [ -a | -c | -g | -i | -d | ...

  7. nacos集群模式搭建踩坑记录

    首先数据库使用的本地的mysql 1.看日志提示no set datasource,使用虚拟机ping本地后发现无法ping通,原因是本地没有关闭防火墙. 2.看日志提示不允许建立数据库连接,原因是r ...

  8. 《码处高效:Java开发手册》之代码风格

    流水淡,碧天长,鸿雁成行.编码风格,简捷清爽,反引无限风光. 在美剧<硅谷>中有这样一个经典镜头,主人公 Richard 与同为开发工程师的女友闹分手,理由是两人对缩进方式有着截然不同的编 ...

  9. Python 速通爆肝、列表推导式、生成器、装饰器、生命游戏

    列表推导式.赋值.切片(替换.插入).字符串处理与判断.enumerate().格式化字符串.读写文件.global 关键字.字符串startswith().类与对象.生成器.装饰器.Self.*ar ...

  10. 生成二维码,并且保存,指定位置的view成图片,并且保存到本地相册

    效果图: 保存的图片效果是: 保存到本地的,是整个视图,不只是单单的二维码的图片, 在了解的一番过程之后,我知道了, 1.首先要去获取保存图片的写入权限:(使用 https://github.com/ ...