2025/11/3 ~ 2025/11/9 做题笔记 - sb

news/2025/11/6 21:45:55/文章来源:https://www.cnblogs.com/SuperSupper/p/19197818

2025/11/6 做题笔记

#9127. Optimal Train Operation

之前遗留下来的斜率优化,因为题面是英文一直没看

在每一个点修建地铁站的代价是 \(a_i\),每两个地铁站之间的代价是 \((j - i + 1)\max\limits_ {i \le k \le j}c_i\),第 0 个地方和第 n + 1 个位置已经修了地铁站。求最小代价

很容易写出状态转移方程 \(f_i = \min\limits_{1 \le j \le i}(f_{j - 1} + (i - j + 1)\max\limits_{j \le k \le i}c_i + a_i)\),之前做过类似的题,但是之前使用 CDQ 做的,现在尝试使用李超树和单调栈写,但是写了十万年。之前以为不用可持久化,但是实际上是要写可持久化的,李超树还写错了,调了好久

Code
#include <iostream>
#include <vector>using namespace std;
using ll = long long;const int kN = 5e5 + 2, kV = 1e9;
const ll kI = 1e18;int n, k, tp, c[kN], a[kN], rt[kN], st[kN];
vector<int> crt;
ll f[kN];
struct Line {ll k, b = kI;ll Calc(int x) { return k * x + b; }
};
struct Tr {Line li;int l, r;
} tr[kN * 50];bool Cmp(Line a, Line b, int x) {return a.Calc(x) < b.Calc(x);
}
void Insert(int& x, int y, Line v, int l = 1, int r = kV) {if (y)tr[x = ++k] = tr[y];!x && (x = ++k);int m = (l + r) / 2;Cmp(v, tr[x].li, m) && (swap(tr[x].li, v), 0);if (Cmp(v, tr[x].li, l))Insert(tr[x].l, tr[y].l, v, l, m);else if (Cmp(v, tr[x].li, r))Insert(tr[x].r, tr[y].r, v, m + 1, r);
}
void Merge(int& x, int y, int l = 1, int r = kV) {if (!x || !y)return x = x + y, void();int m = (l + r) / 2;Insert(x, 0, tr[y].li, l, r);Merge(tr[x].l, tr[y].l, l, m), Merge(tr[x].r, tr[y].r, m + 1, r);
}
ll Query(int x, int p, int l = 1, int r = kV) {if (!x)return kI;if (l == r)return tr[x].li.Calc(p);int m = (l + r) / 2;ll res = tr[x].li.Calc(p);if (p <= m)return min(res, Query(tr[x].l, p, l, m));return min(res, Query(tr[x].r, p, m + 1, r));
}int main() {
#ifndef ONLINE_JUDGEfreopen("in", "r", stdin);freopen("out", "w", stdout);
#endifcin.tie(0)->sync_with_stdio(0);cin >> n;for (int i = 1; i <= n; i++)cin >> c[i];for (int i = 1; i < n; i++)cin >> a[i];crt.push_back(0), f[1] = a[1] + c[1];Insert(rt[1], 0, {0, 0}), st[++tp] = 1;crt.push_back(++k), Insert(crt.back(), 0, {c[1], 0});for (int i = 2; i <= n; i++) {for (; tp && c[i] >= c[st[tp]]; tp--, crt.pop_back())Merge(rt[i], rt[st[tp]]);if (!tp)f[i] = Query(rt[i], c[i]) + 1ll * i * c[i] + a[i];else if (!rt[i])f[i] = Query(crt.back(), i) + a[i];elsef[i] = min(Query(rt[i], c[i]) + 1ll * i * c[i], Query(crt.back(), i)) + a[i];if (i == 6)cerr << Query(rt[i], c[i]) << '\n';f[i] = min(f[i], f[i - 1] + c[i] + a[i]);Insert(rt[i], 0, {-i + 1, f[i - 1]}), st[++tp] = i;int t = crt.back();crt.push_back(++k), Insert(crt.back(), t, {c[i], Query(rt[i], c[i])});}cout << f[n];return 0;
}

A. チェリーポップ

期望得分:100pts

实际得分:100pts

时间分配:3h

一开始猜了个结论,但是显然是错的,后来有想了很久,决定先打个暴力再找规律。暴力还调了比较久的时间。找到规律写了双指针,不敢确认还写了个拍子,花费了很久的时间。

我觉得问题主要在于我没有发现这个东西是有单调性的,这题的单调性在于越长的区间比短的区间一定更加可能合法,因为包含了一段短的合法区间后,再加入额外一段长的合法区间时,可以理解为分别重排后也可以合法。考虑极端数据重排之后会使得交界处相同,但是举了一点例子后发现并不可能。想不到的时候真应该直接猜有单调性,缩小枚举范围,CSP-S T2 也应该尝试这么做的,实在举不出来反例就可以假设他有了

Code
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>using namespace std;const int kN = 2e6 + 1;int T, n, l, r, ans = kN, a[kN][3];
map<char, int> mp;
string s;bool Check(int l, int r) {int p = 0, c[3];for (int o : {0, 1, 2}) {c[o] = a[r][o] - a[l - 1][o];if (c[o] > c[p])p = o;}if (c[p] > (r - l + 2) / 2)return 0;if (c[p] == (r - l + 2) / 2) {if ((r - l + 1) & 1)return mp[s[l - 1]] != p && mp[s[r + 1]] != p;int _p = -1;for (int o : {0, 1, 2})if (o != p && (_p == -1 || c[_p] < c[o]))_p = o;return mp[s[l - 1]] != mp[s[r + 1]] || (mp[s[l - 1]] != p && (mp[s[l - 1]] != _p || c[_p] != (r - l + 1) / 2));}return 1;
}int main() {
#ifndef ONLINE_JUDGEfreopen("in", "r", stdin);freopen("out", "w", stdout);
#endifcin.tie(0)->sync_with_stdio(0);mp['C'] = 0, mp['W'] = 1, mp['P'] = 2, mp[' '] = 114514;for (cin >> T; T--; ans = kN) {cin >> n >> s, s = ' ' + s + ' ';for (int i = 1; i <= n; i++)for (int o : {0, 1, 2})a[i][o] = a[i - 1][o] + (mp[s[i]] == o);for (l = 2; l <= n && s[l] != s[l - 1]; l++);for (r = n - 1; r >= 1 && s[r] != s[r + 1]; r--);if (l > n) {cout << "0\n";continue;}if (l > r) {int j;for (j = l + 1; j <= n && !Check(l, j); j++);if (j <= n)ans = min(ans, j - l + 1);for (j = r - 1; j >= 1 && !Check(j, r); j--);if (j >= 1)ans = min(ans, r - j + 1);swap(l, r);}int _l = 1, _r = r;for (; _l <= l && _r <= n; _l++) {for (; _r <= n && !Check(_l, _r); _r++);if (_r <= n)ans = min(ans, _r - _l + 1);}if (ans == kN)cout << "-1\n";elsecout << ans << '\n';}return 0;
}

B. ラビットホール

期望得分:24pts

实际得分:24pts

时间分配:1h

想到了叶子实际上没什么用,但是剩下的时间不够了想打 T3 暴力,所以没有继续想了。调了也挺久的。。。

要能想到双指针,因为大的区间合法小的就一定合法。考虑加点和删点的过程,唯一的难点是每次加点和删点的时候枚举产生变化的点(从叶子到非叶子或者从非叶子到叶子)所连的边是复杂度正确的,感觉上是对的,但是证明可能比较复杂

Code
#include <iostream>
#include <vector>using namespace std;const int kN = 1e6 + 1;int n, m, q, mx, deg[kN], sec[kN], sta[kN], cnt[kN], ans[kN];
vector<int> e[kN];void Add(int x, int l, int r) {if (sta[x] || deg[x] < 2)return;sta[x] = 1;for (int i : e[x]) {if (i < l || i >= r || !sta[i])continue;cnt[sec[i]]--;mx = max(mx, ++sec[i]), cnt[sec[i]]++;sec[x]++;}mx = max(mx, sec[x]), cnt[sec[x]]++;
}
void Del(int x, int l, int r) {if (!sta[x] || deg[x] >= 2)return;sta[x] = 0, cnt[sec[x]]--, sec[x] = 0;for (int i : e[x]) {if (i < l || i > r || !sta[i])continue;cnt[sec[i]]--, cnt[--sec[i]]++;}
}int main() {
#ifndef ONLINE_JUDGEfreopen("in", "r", stdin);freopen("out", "w", stdout);
#endifcin.tie(0)->sync_with_stdio(0);cin >> n >> m >> q;for (int i = 1, x, y; i <= m; i++)cin >> x >> y, e[x].push_back(y), e[y].push_back(x);for (int l = 1, r = 0; l <= n; l++) {for (r += (mx <= 2); r <= n && mx <= 2; r += (mx <= 2)) {for (int i : e[r])if (l <= i && i <= r)deg[i]++, deg[r]++, Add(i, l, r);Add(r, l, r);}ans[l] = r;deg[l] = 0, Del(l, l, r);for (int i : e[l])if (l <= i && i <= r)deg[i]--, Del(i, l, r);for (; mx > 0 && cnt[mx] <= 0; mx--);}for (int l, r; q--;) {cin >> l >> r;cout << (r < ans[l] ? "Yes\n" : "No\n");}return 0;
}

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

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

相关文章

利用Google Dork挖掘敏感文件setup.sh的技术解析

本文详细解析了如何使用Google Dork语法"intitle:index of setup.sh"来发现互联网上公开的敏感配置文件setup.sh,这些文件可能包含服务器配置信息、数据库凭证等关键数据,对网络安全评估具有重要意义。Goo…

11.6 程序员的修炼之道:从小工到专家 第四章 注重实效的偏执 - GENGAR

这五节内容围绕编程中的容错设计、逻辑校验和资源管理展开,核心是通过科学的编码规范与工具,尽早发现问题、降低隐患,提升程序可靠性。 按合约设计(DBC)是核心校验理念,通过前条件、后条件和类不变项明确模块的权…

2025.11.6~?

2025.11.6 复盘,上午平复了一下心情 做了P2375,首先注意题中说的数量,然后发现nxt树组指的是前缀和后缀相等,数量的话,直接用nxt递推即可,然后至于不交,就维护一直不交,然后用nxt的答案即可 做了P3426,最开始…

详细介绍:自建数字资源库:技术架构全解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

人工智能价值权衡的元理论:三值纠缠与文明演进的动力学框架

人工智能价值权衡的元理论:三值纠缠与文明演进的动力学框架 摘要:随着人工智能在复杂决策中扮演日益重要的角色,其面临的核心挑战已从单纯的价值对齐转向如何在多元、动态且时常冲突的人类价值中进行权衡。本文系统…

golang面经——内存相关模块 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11/7

今天上午体育课比赛但没轮到我们组,说实话我感觉我们组如果上了应该可以拿个好名次,看完他们比赛

QOJ4795 Taxi

题意简述 给定一颗 \(n\) 个点的树,边有边权。有 \(m\) 个独立的乘客和 \(m\) 个独立的司机,每个人选一个节点。将乘客与司机匹配,使得距离之和最大。 求所有 \(n^{2m}\) 种可能情况的距离之和 \(\bmod 10^9+7\)。 …

蓝牙耳机怎么连接电脑?【图文详解】蓝牙耳机连接电脑?蓝牙耳机能连接电脑吗?USB蓝牙适配器? - 详解

蓝牙耳机怎么连接电脑?【图文详解】蓝牙耳机连接电脑?蓝牙耳机能连接电脑吗?USB蓝牙适配器? - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

AI浪潮下的就业迷思:技术迭代还是泡沫破灭?

最近刷到一堆AI相关的新闻,从OpenAI和亚马逊签下天价算力订单,到谷歌推出能预警洪水的地球级AI,再到微软自研图像模型减少对OpenAI的依赖,感觉整个科技圈都在疯狂押注AI。但作为一个学软件的学生,我反而有点焦虑:…

洛谷 P4159

给定一个 \(n\) 个节点的有向图,连接 \((i, j)\) 的有向边边权为 \(c_{i, j}(0 为没有边)\),问有多少种从 \(1\) 到 \(n\) 的方式使得经过的边边权之和为 \(k\)。 \(n \le 10, c \le 9, k \le 10^9\)。如果 \(c\) 只…

25.11.6 DAG和拓扑排序

一.DAG即有向无环图,常用于: 任务依赖:某任务必须在另一个任务完成后执行(如编译依赖、任务调度)。 课程顺序:先修课关系。 表达式计算顺序。 动态规划优化:例如在 DAG 上进行最长路径、最短路径 DP。 二.拓扑排…

2025-11-06 PQ v.Next日志记录

项目核心信息目前初步预计在这里进行开发测试(后续到develop): https://z.gitee.cn/zgca/projects/777586/repos/zgca/aipq/tree/feature%2Fteacher_feel今日进度(4*4): 当前任务:全员微信开发能力培训完成,活…

数据库介绍,安装,配置

https://www.cnblogs.com/linhaifeng/articles/7126847.html 1.数据库服务器:运行数据库管理软件的计算机 2.数据库管理软件:MySQL,Oracle,db2,SQLserver 3.库:文件夹 4.表:文件 5.记录:事物一系列的特征:cy,…

Spring BeanFactory 接口

[[Spring IOC 源码学习总笔记]] BeanFactory 的子接口 Spring BeanFactory 的设计, 基于接口隔离原则(Interface Segregation Principle), 将具有不同细分的功能定义为接口, 增加扩展性, 支持不同功能的 BeanFactory…

领码方案|微服务与SOA的世纪对话(3):方法论新生——DDD、服务网格与AI Ops的融合之道 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

遗留系统微服务改造(四):从单体到微服务的演进之路 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

备考笔记8

创建型:单抽原建厂 结构型:外桥组元代配饰 行为型:观模迭策责令解访介忘态 分页存储,位示图,多级索引,树的性质

不用Docker也能跑RustFS?Windows一键安装实测来了!

不用Docker也能跑RustFS?Windows一键安装实测来了!2025年,当所有人都在用Docker部署RustFS时,我们偏要反其道而行——​在Windows上直接运行RustFS二进制版​,实测结果令人惊喜:​​安装5分钟搞定,内存占用<…

Spacy 词性 实体 依存关系等对应缩写

dep: 依存关系标签(Dependency Label) ROOT -- None 中心词,通常是动词 最重要的词,从它开始,根节点acl -- clausal modifier of noun (adjectival clause)形容词性从句acomp -- adjectival complement 形容…