热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:bzoj5017[Snoi2017]炸弹(线段树优化建图+)tarjan缩点+拓扑排序

题目传送门https://lydsy.com/JudgeOnline/problem.php?id=5017题解这个题目方法挺多的。线段树优化建图线段树优化建图的做法应该挺显然的,一个炸弹能够引爆的炸

题目传送门

https://lydsy.com/JudgeOnline/problem.php?id=5017

题解

这个题目方法挺多的。

线段树优化建图

线段树优化建图的做法应该挺显然的,一个炸弹能够引爆的炸弹的显然应该是一个区间里面的,直接对这个区间进行线段树优化建图。

这样可以得到一个带环图,缩点以后这个炸弹能够炸到的炸弹就是从这个点能够走到的点。

但是这个不太好做,不过可以发现最终的炸弹也是一个区间,所以可以通过缩点后的 DAG 来求出左右端点。

时间复杂度 (O(nlog n)),空间复杂度 (O(nlog n))



一般的建图

可以发现在一个点可以炸到的炸弹中,真正会对最终答案的左右端点有贡献的只有这些炸弹里面左端点最小的和右端点最大的炸弹。

直接对这两个炸弹建边就可以了,然后和上面一样,先 tarjan 缩点,然后在 DAG 上跑出来左右端点。

但是因为想要确定左右端点对应的位置,所以这个 (log) 还是没有办法去掉。

时间复杂度 (O(nlog n)),空间复杂度 (O(n))



神仙的线性递推做法

https://www.cnblogs.com/saigyouji-yuyuko/p/11771364.html

丢个链接跑路。

我不会,好像很神仙的样子。

听说是时空都是线性的哦。


#include
#define fec(i, x, y) (int i = head[x], y = g[i].to; i; i = g[i].ne, y = g[i].to)
#define dbg(...) fprintf(stderr, __VA_ARGS__)
#define File(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
#define fi first
#define se second
#define pb push_back
template inline char smax(A &a, const B &b) {return a template inline char smin(A &a, const B &b) {return b typedef long long ll; typedef unsigned long long ull; //typedef std::pair pii;
template inline void read(I &x) {
int f = 0, c;
while (!isdigit(c = getchar())) c == '-' ? f = 1 : 0;
x = c & 15;
while (isdigit(c = getchar())) x = (x <<1) + (x <<3) + (c & 15);
f ? x = -x : 0;
}
const int N = 500000 + 7;
const int M = 500000 * 2 + 7;
const int P = 1e9 + 7;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int LOG = 19;
typedef std::pair pii;
int n, m, sccno, dfc, tp;
int dfn[N], low[N], scc[N], s[N];
std::vector v[N];
ll a[N], r[N], dpl[N], dpr[N];
pii minl[N][LOG], maxr[N][LOG];
struct Edge { int to, ne; } g[M]; int head[N], tot;
inline void addedge(int x, int y) { g[++tot].to = y, g[tot].ne = head[x], head[x] = tot; }
inline void adde(int x, int y) { addedge(x, y), addedge(y, x); }
inline void dfs(int x) {
dfn[x] = low[x] = ++dfc, s[++tp] = x;
for fec(i, x, y) if (!dfn[y]) dfs(y), smin(low[x], low[y]);
else if (!scc[y]) smin(low[x], dfn[y]);
if (low[x] == dfn[x]) {
++sccno;
dpl[sccno] = INF, dpr[sccno] = -INF;
while (1) {
int y = s[tp--];
scc[y] = sccno, smax(dpr[scc[y]], a[y] + r[y]), smin(dpl[scc[y]], a[y] - r[y]);
v[scc[y]].pb(y);
if (x == y) break;
}
}
}
inline void tarjan() {
for (int i = 1; i <= n; ++i)
if (!dfn[i]) dfs(i);
}
inline void rmq_init() {
for (int i = 1; i <= n; ++i) minl[i][0] = pii(a[i] - r[i], i), maxr[i][0] = pii(a[i] + r[i], i);
for (int j = 1; (1 < for (int i = 1; i + (1 < minl[i][j] = std::min(minl[i][j - 1], minl[i + (1 <<(j - 1))][j - 1]),
maxr[i][j] = std::max(maxr[i][j - 1], maxr[i + (1 <<(j - 1))][j - 1]);
}
inline pii qmin(int l, int r) {
int k = std::__lg(r - l + 1);
return std::min(minl[l][k], minl[r - (1 <}
inline pii qmax(int l, int r) {
int k = std::__lg(r - l + 1);
return std::max(maxr[l][k], maxr[r - (1 <}
inline void work() {
rmq_init();
for (int i = 1; i <= n; ++i) {
int pl = std::lower_bound(a + 1, a + n + 1, a[i] - r[i]) - a,
pr = std::upper_bound(a + 1, a + n + 1, a[i] + r[i]) - a - 1;
addedge(i, qmin(pl, pr).se);
addedge(i, qmax(pl, pr).se);
}
tarjan();
for (int i = 1; i <= sccno; ++i) {
int len = v[i].size();
for (int j = 0; j int x = v[i][j];
for fec(iii, x, y) smin(dpl[i], dpl[scc[y]]), smax(dpr[i], dpr[scc[y]]), assert(scc[y] <= i);
}
}
ll ans = 0;
for (int i = 1; i <= n; ++i) {
int pl = std::lower_bound(a + 1, a + n + 1, dpl[scc[i]]) - a,
pr = std::upper_bound(a + 1, a + n + 1, dpr[scc[i]]) - a - 1;
ans += (ll)i * (pr - pl + 1);
}
printf("%lld
", ans % P);
}
inline void init() {
read(n);
for (int i = 1; i <= n; ++i) read(a[i]), read(r[i]);
}
int main() {
#ifdef hzhkk
freopen("hkk.in", "r", stdin);
#endif
init();
work();
fclose(stdin), fclose(stdout);
return 0;
}

推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
author-avatar
混事珊远_692
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有