[ABC266Ex] Snuke Panic (2D) 题解

news/2025/1/24 21:27:40/文章来源:https://www.cnblogs.com/ccxswl/p/18690366

[ABC266Ex] Snuke Panic (2D) 题解

前言

前几天看到了这个,发现自己还真没仔细思考过。

做了两道题,把这个题当个总结。

思路

\(f_i\) 表示:在 \(T_i\) 走到第 \(i\) 个节点的最大收益。

有转移:\(f_i=\max \{f_j\} + A_i\)

其中 \(j\) 需要满足:

  • \(y_j\le y_i\)
  • \(T_i\le T_i\)
  • \(|x_i-x_j|+y_i-y_j\le T_i-T_j\)

第三条限制可以转化为:\(x_i-x_j+y_i-y_j\le T_i-T_j \land x_j-x_i+y_i-y_j\le T_i-T_j\)

容易发现满足第三条限制一定满足第二条限制,所以有如下限制:

  • \(y_i\ge y_j\)
  • \(x_i+y_i-T_i\le x_j+y_j-T_j\)
  • \(-x_i+y_i-T_i\le -x_j+y_j-T_j\)

然后其实就是三维偏序了。因为这些点没有顺序限制,所以在外层可以排序掉一维,第二维可以用 CDQ 分治处理,第三为用树状数组即可。值得注意的是,因为有初始的点 \((0,0)\),所以我们有 \(n+1\) 个点,离散化后树状数组应该跑到 \(n+1\)

CDQ 实现的时候为什么和平常写的不太一样?

这里的“平常”指先把左右都递归下去再算贡献。

因为如果我们按平常的做法,其实是左右各自贡献,如下图中橙色。但这会出问题,我们更新最右边的时候用的是没有被左边更新右端的左侧,所以错了。

粉色的顺序才应该是对的。

代码

#include <bits/stdc++.h>using namespace std;#define int long long#define IL inline
#define vec vector
#define bg begin
#define eb emplace_back
#define emp emplace
#define fi first
#define se second
#define mkp make_pair
#define lb lower_bound
#define ub upper_bound
using ubt = long long;
using uubt = unsigned long long;
using dub = double;
using pii = pair<int, int>;
using puu = pair<ubt, ubt>;IL void ckx(int &x, const int &y) { (x < y) && (x = y); }
IL void ckm(int &x, const int &y) { (x > y) && (x = y); }template <typename T = int>
IL T _R() {T s = 0, w = 1;char c = getchar();while (!isdigit(c)) w = c == '-' ? -1 : 1, c = getchar();while (isdigit(c)) s = s * 10 + c - 48, c = getchar();return s * w;
}const int inf = 1e18;const int N = 1e5;
const int maxN = N + 3;int n;
int f[maxN], id[maxN], fid[maxN];
int sot[maxN];struct node {int x, y, t;int A;int k1, k2;IL void init() {k1 = -x + sot[y] - t;k2 = x + sot[y] - t;}IL friend bool operator < (const node &A, const node &B) {if (A.k2 != B.k2) return A.k2 > B.k2;if (A.k1 != B.k1) return A.k1 > B.k1;if (A.y != B.y) return A.y < B.y;if (A.t != B.t) return A.t < B.t;assert(false);}IL friend bool operator <= (const node &A, const node &B) {return !(B < A);}
} a[maxN];IL bool cmp(int i, int j) { return a[i] < a[j]; }struct BIT {int t[maxN];IL void ins(int x, int b) {for (; x <= n + 1; x += x & -x) ckx(t[x], b);}IL int ask(int x) {int res = -inf;for (; x > 0; x -= x & -x) ckx(res, t[x]);return res;}IL void clr(int x) {for (; x <= n + 1; x += x & -x) t[x] = -inf;}BIT() { memset(t, ~0x3f, sizeof(t)); }
} T;void cdq(int l, int r) {if (l == r) return;int mid = (l + r) >> 1;cdq(l, mid);for (int i = mid + 1; i <= r; i++) fid[i] = id[i];sort(fid + mid + 1, fid + r + 1, cmp);int t1 = l, t2 = mid + 1;while (t1 <= mid && t2 <= r) {if (a[id[t1]] <= a[fid[t2]]) {T.ins(a[id[t1]].y, f[id[t1]]);t1++;} else {ckx(f[fid[t2]], T.ask(a[fid[t2]].y) + a[fid[t2]].A);t2++;}}while (t2 <= r)ckx(f[fid[t2]], T.ask(a[fid[t2]].y) + a[fid[t2]].A),t2++;for (int i = l; i <= mid; i++) T.clr(a[id[i]].y);cdq(mid + 1, r);stable_sort(id + l, id + r + 1, cmp);
}signed main() {n = _R();for (int i = 1; i <= n; i++) {a[i].t = _R(), a[i].x = _R(), a[i].y = _R(), a[i].A = _R();sot[i] = a[i].y;}sot[n + 1] = 0;sort(sot + 1, sot + n + 2);for (int i = 0; i <= n; i++)a[i].y = lb(sot + 1, sot + n + 2, a[i].y) - sot;for (int i = 0; i <= n; i++)a[i].init();sort(a, a + n + 1, [&](const auto &A, const auto &B) {if (A.k1 != B.k1) return A.k1 > B.k1;if (A.k2 != B.k2) return A.k2 > B.k2;if (A.y != B.y) return A.y < B.y;if (A.t != B.t) return A.t < B.t;assert(false);});memset(f, ~0x3f, sizeof(f));f[0] = 0;for (int i = 0; i <= n; i++) id[i] = i;cdq(0, n);int ans = 0;for (int i = 1; i <= n; i++) ckx(ans, f[i]);printf("%lld\n", ans);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874886.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek R1果然有点意思! Windows本地使用ollama轻松跑起来。

这段时间国内外讨论DeepSeek的人都比较多,我印象比较深的是,Deepseek用较低的成本训练了一个不错的模型。另一个是说最近的R1可以匹敌chatgpt的o1。 对比chatgpt的模型很多,我也不知道是宣传而已,还是真的这么牛逼。所以准备本地运行一下看看。因为ollama上已经有这个模型了…

跟着狂神学java-第一天

Markdown学习 标题 (一个#+空格,一级标题) 二级标题 (两个#+空格,二级标题) 三级标题 (以此类推。。。) 字体helloworld (两个星号,加粗) hello world ( 一个星号,斜体) hello world (三个*,加粗的斜体) hello world (两个~,删除线) hello world…

36. 打印机

一、打印机应用程序一般都有打印功能,可以将重要内容打印成纸质资料。PySide6 支持打印操作,它可以识别系统中已经安装的打印机,驱动打印机进行工作,可以用与打印机有关的类直接打印,也可通过打印对话框进行打印,还可对打印的内容在打印前进行打印预览。与打印有关的类主…

MiniCPM-o 2.6 本地部署记录,Windows+RTX3060全部跑通!

上一篇中,大致聊了下国产小钢炮MiniCPM的特性,看起来很不错,可玩性很高。今天,主要来说一下,如何在本地运行这个项目。 添加图片注释,不超过 140 字(可选)配置过程花了一些时间,最终还是成功了,可以正常进行视频通话,语音通话,和聊天机器人。安装和测试过程中遇到了…

CTF-web-计算器

1.打开题目2.发现只能输入一个数字 3.查看源代码4.修改参数5.可以正确输入后得到flag

CTF-web-web2

1.打开靶场,发现是一个动图。2.通过直接查看源代码,发现flag3.flag :KEY{Web-2-bugKssNNikls9100}

WC 2025 游记

前情提要:CSP 运气好,苟进来了。然后 NOIP 爆炸,没去任何 THU/PKUWC。 Day 1 (1.17) 早上 5:30 起来往火车站跑,太幽默了。 到了就开始摆烂,胸牌只有一面有名字,另一面是“日程安排”。晚上是开幕式,唯一亮点是 dzd 讲话。上大学的时候,政治老师说:资本主义必然灭亡,…

RTE 社区 2024 总结:虽然「卷」,但可以和一群朋友一起,找到自己的速度丨RTE 开发者社区

「如果用一个词来总结你的 2024,将会是什么?」「卷。」「朋友。」「速度。」2025 年 1 月 4 日,小寒前夕,在北京甜水园的苟市和上海静安的 Solution,一群 Real-Time AI&Voice Agent Builder 加入了一场名为 「RTE Dev Party 2024o」的年度开发者聚会。席间觥筹交错,欢…

要成为客户的顾问、朋友、陪跑者

在销售领域,传统的 “推销” 模式正逐步被更为人性化、服务导向的理念所取代。出色的销售人员不再仅仅局限于销售产品,更重要的是身兼客户的顾问、朋友与陪跑者这三重角色。以下为您介绍如何在这三个角色间灵活转换,以此深化客户关系,提高销售业绩。 一、成为客户的顾问专业…

卡特兰数 Catalan

卡特兰数 定义 \(Catalan\) 数列 \(H_n\) 是以下问题的方案数:有一个大小为 \(n n\) 的方格图,左下角为 \((0, 0)\) 右上角为 \((n, n)\),从左下角开始 每次都只能向右或者向上走一单位,不走到对角线 \(y = x\) 上方(但可以触碰) 的情况下到达右上角有多少可能的路径? …

【vjudge训练记录】大一寒假专项训练——并查集

训练情况A题 并查集模板,求班级最多人数和班级数,可以使用map进行统计,取父节点塞进map里面,取最大值和size即可点击查看代码 #include <bits/stdc++.h> // #define int long long #define endl \nusing namespace std;const int N = 1e5 + 3;int fa[N];int n,m;int …

2024山西中考数学第15题

如图,在 $▱ABCD$ 中,$AC$ 为对角线,$AE⊥BC$ 于点 E,点 $F$ 是 $AE$ 延长线上一点,且 $∠ACF = ∠CAF$,线段 $AB$,$CF$ 的延长线交于点 $G$,若 $AB=\sqrt{5}$,$AC=4$,$\tan∠ABC=2$,则 $BG$ 的长为_________.解析 勾股定理+建系 过程 解:由题得,$AE=2$,$BE=1$。…