• 题意: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大雪纷飞

    canvas大雪纷飞 前言:正好业务触及到canvas,看完api顺手写个雪花效果,因为之前看到过很多次这个,主要看思路,想象力好的可以慢慢去创作属于自己的canvas效果 思路: 利用画圆arc() ...

  2. ES6-11学习笔记--Set

    Set:一种新的数据结构 常用方法 遍历 应用场景 WeakSet   常用方法: // Set的成员值一定是唯一的不重复的 let s = new Set([1, 2, 3, 2]) // 添加数据 ...

  3. String和int、long、double等基本数据类型的转换

    学习目标: 掌握Java的基本数据类型与String的转换 学习内容: 1.转化规则 String 转 基本数据类型 基本数据类型 变量 = 包装类.Parse基本数据类型(String); // c ...

  4. Java之万年历

    @(文章目录) 二.Java之万年历 2.1 要求 输入年份: 输入月份: 输出某年某月的日历. 2.2 思路 实现从控制台接收年和月,判断是否是闰年(判断是否是闰年:能被4整除但不能被100整除:或 ...

  5. perf性能分析工具使用分享

    @ 目录 前言 perf的介绍和安装 perf基本使用 perf list使用,可以列出所有的采样事件 perf stat 概览程序的运行情况 perf top实时显示当前系统的性能统计信息 perf ...

  6. ionic系列教程 2 ---- 安装

    开发平台注意点首先,我们需要注意构建Ionic App需要的最低配置:Ionic只支持iOS6 +和Android 4.0 + ,(虽然2.3可以工作,但会有点卡).但是,Android设备众多,可能 ...

  7. 算法基础③--DFS解决迷宫问题入门

    迷宫问题 通过深度优先搜索(DFS)方法实现. 迷宫问题一 一天蒜头君掉进了一个迷宫里面,蒜头君想逃出去,可怜的蒜头君连迷宫是否有能逃出去的路都不知道. 看在蒜头君这么可怜的份上,就请聪明的你告诉蒜头 ...

  8. 详解javascript的eventloop(二):eventloop和dom渲染

    记住: JS是单线程的,他和dom渲染共用一个线程 JS执行的时候,会给dom渲染留一些时机 上一篇讲到eventloop的执行机制,但是在这个机制中的call stack执行完成后(包括第一遍的ev ...

  9. python基础练习题(题目 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少)

    day13 --------------------------------------------------------------- 实例021:猴子偷桃 题目 猴子吃桃问题:猴子第一天摘下若干 ...

  10. Hadoop(三)通过C#/python实现Hadoop MapReduce

    MapReduce Hadoop中将数据切分成块存在HDFS不同的DataNode中,如果想汇总,按照常规想法就是,移动数据到统计程序:先把数据读取到一个程序中,再进行汇总. 但是HDFS存的数据量非 ...