1.19 CW 模拟赛 T2. Everybody Lost Somebody

news/2025/1/19 19:56:55/文章来源:https://www.cnblogs.com/YzaCsp/p/18679866

前言

心态不好, 多想想

那我是不是要去学后缀数组?
好的跑去学了一下()

思路

首先考虑 \(\textrm{sa, height}\) 数组的约束

在此之前先给出一些定义

  • \(\textrm{sa}\) 数组存储排名为 \(i\) 的后缀在原序列上的位置
  • \(\textrm{rank}\) 数组存储原序列上的位置对应的排名
  • \(\textrm{height}\) 数组存储相邻排名的后缀的最大公共前缀

考虑其约束

  • \(\forall i \in (1, n], S[\textrm{sa}_i] \geq S[\textrm{sa}_{i - 1}]\)
    这是显然的, 否则不可能满足排名, 更一般的
    \(\displaystyle rank_{\textrm{sa}_{i-1}+1}>rank_{\textrm{sa}_i+1} \textrm{ s.t. } S[\textrm{sa}_i] > S[\textrm{sa}_{i - 1}] \)

  • \(\forall i \in (1, n], j \in [0, \textrm{height}_i), S[\textrm{sa}_i + j] = S[\textrm{sa}_{i - 1} + j]\)
    也不难理解
    进一步的, 还约束了
    \(\displaystyle i + \textrm{height}_i \leq n \textrm{ s.t. } S[\textrm{sa}_i + \textrm{height}_i] > S[\textrm{sa}_{i - 1} + \textrm{height}_i] \)

好约束全了, 就是说我也是可能想得到

差分约束做法 (\(\rm{fake}\))

思路

看到这一车不等式考虑差分约束

搞得具体一点

首先对于这个约束

\(\forall i \in (1, n], S[\textrm{sa}_i] \geq S[\textrm{sa}_{i - 1}]\)
更一般的
\(\displaystyle rank_{\textrm{sa}_{i-1}+1}>rank_{\textrm{sa}_i+1} \textrm{ s.t. } S[\textrm{sa}_i] > S[\textrm{sa}_{i - 1}] \)

发现可以转化成两种情况

\(S[\textrm{sa}_i] \geq S[\textrm{sa}_{i - 1}] + 0\)
\(S[\textrm{sa}_i] \geq S[\textrm{sa}_{i - 1}] + 1\)

究其原因是 \(S\) 必须是整数, 不然找一个 \(\rm{ASCLL}\)\(16.75\) 的东西给我

其次对于这个约束

\(\forall i \in (1, n], j \in [0, \textrm{height}_i), S[\textrm{sa}_i + j] = S[\textrm{sa}_{i - 1} + j]\)
进一步的
\(\displaystyle i + \textrm{height}_i \leq n \textrm{ s.t. } S[\textrm{sa}_i + \textrm{height}_i] > S[\textrm{sa}_{i - 1} + \textrm{height}_i] \)

类似上面转化成

\(S[\textrm{sa}_i + j] \geq S[\textrm{sa}_{i - 1} + j] + 0\)
\(S[\textrm{sa}_i + j] + 0 \leq S[\textrm{sa}_{i - 1} + j]\)
\(S[\textrm{sa}_i + \textrm{height}_i] \geq S[\textrm{sa}_{i - 1} + \textrm{height}_i] + 1\)

具体为什么要搞成最长路的形式, 在这里进行一次证明
我们想令 \(dis_n \geq dis_1 + L\) , 只有最长路才满足这个柿子, 相当于求出了 \(dis_n\) 的最小值

你发现最长路可能出现正权边, 需要使用 \(\rm{spfa}\)
注意全局加一个 \(S[0] + 1 \leq S[i], i \in [1, n]\)

实现

#include <bits/stdc++.h>
const int MAXN = 5206; //41int n;
int sa[MAXN], rk[MAXN], height[MAXN]; // 后缀数组常用数组class graph
{
private:
public:struct node { int from, to, w, next; };node edge[MAXN * MAXN]; int cnt = 0, head[MAXN];/*初始化*/ void head_init() { for (int i = 0; i <= n; i++) head[i] = -1; }/*加边*/ void addedge(int u, int v, int w) { edge[++cnt].to = v; edge[cnt].from = u, edge[cnt].w = w, edge[cnt].next = head[u]; head[u] = cnt; }
} gra;/*建图*/
void mkgra() {gra.head_init();/*第一类约束*/ for (int i = 2; i <= n; i++) (rk[sa[i - 1] + 1] > rk[sa[i] + 1]) ? gra.addedge(sa[i - 1], sa[i], 1) : gra.addedge(sa[i - 1], sa[i], 0);/*第二类约束*/for (int i = 2; i <= n; i++) {if (!(~height[i])) continue;for (int j = 0; j < height[i]; j++) gra.addedge(sa[i] + j, sa[i - 1] + j, 0), gra.addedge(sa[i - 1] + j, sa[i] + j, 0);if (i + height[i] <= n) gra.addedge(sa[i - 1] + height[i], sa[i] + height[i], 1);}/*超级原神*/ for (int i = 1; i <= n; i++) gra.addedge(0, i, 1);
}int dis[MAXN]; bool inq[MAXN]; std::queue<int> q;
/*差分约束*/
void spfa(int st) {memset(inq, false, sizeof inq); memset(dis, 128, sizeof dis);dis[st] = 0; q.push(st); inq[st] = true;while (!q.empty()) {int u = q.front(); q.pop(); inq[u] = false;for (int e = gra.head[u]; ~e; e = gra.edge[e].next) {int v = gra.edge[e].to, w = gra.edge[e].w;if (dis[v] < dis[u] + w) {dis[v] = dis[u] + w;if (!inq[v]) { inq[v] = true; q.push(v); }}}}
}int main()
{scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &sa[i]), rk[sa[i]] = i;for (int i = 2; i <= n; i++) scanf("%d", &height[i]);mkgra();spfa(0);for (int i = 1; i <= n; i++) std::cout << char(dis[i] + 'a' - 1);return 0;
}

更巧妙的做法

思路

你发现跑差分约束还是太神经了
事实上建出来的图中, \(=0\) 的边连接的两点合并到一起, 剩下的就是个拓扑排序

进一步发现 \(\textrm{sa}\) 一定是一种拓扑排序, 按照其处理即可
\(=0\) 的合并考虑使用并查集

具体一点
首先对于这个约束

\(\forall i \in (1, n], S[\textrm{sa}_i] \geq S[\textrm{sa}_{i - 1}]\)
更一般的
\(\displaystyle rank_{\textrm{sa}_{i-1}+1}>rank_{\textrm{sa}_i+1} \textrm{ s.t. } S[\textrm{sa}_i] > S[\textrm{sa}_{i - 1}] \)

考虑记录所有 \(<\) 的连边, 如果是 \(\leq\) 的连边, 直接在最后计算答案的时候, 把 \(ans_{\textrm{sa}_i}\) 先赋值成 \(S[\textrm{sa}_{i - 1}]\) 即可, 正确性在于 \(\textrm{sa}\) 顺序一定是一个拓扑序

其次对于这个约束

\(\forall i \in (1, n], j \in [0, \textrm{height}_i), S[\textrm{sa}_i + j] = S[\textrm{sa}_{i - 1} + j]\)
也不难理解
进一步的, 还约束了
\(\displaystyle i + \textrm{height}_i \leq n \textrm{ s.t. } S[\textrm{sa}_i + \textrm{height}_i] > S[\textrm{sa}_{i - 1} + \textrm{height}_i] \)

我们考虑把所有 \(=\) 缩成一个点, 然后 \(<\) 正常连边

注意一点是先处理缩点再加边

总的来说, 我们先合并, 再建边, 最后处理答案的时候带上 \(\leq\) 的约束

实现

这个思路不难实现, 直接给出 \(\rm{std}\)

#include <bits/stdc++.h>
#define fo(i, a, b) for (int i = a; i <= b; i++)
using namespace std;const int maxn = 5005;int n;
int SA[maxn], Rank[maxn], height[maxn];int eql[maxn];
vector<int> larger[maxn];
int geteql(int x) { return eql[x] == x ? x : eql[x] = geteql(eql[x]); }int T;
char ans[maxn];
int main()
{scanf("%d", &n);fo(i, 1, n) scanf("%d", &SA[i]), Rank[SA[i]] = i;fo(i, 2, n) scanf("%d", &height[i]);Rank[0] = Rank[n + 1] = 0;fo(i, 1, n) eql[i] = i;fo(i, 2, n) if (height[i] > -1){int x = SA[i - 1], y = SA[i];fo(j, 1, height[i]) eql[geteql(x + j - 1)] = geteql(y + j - 1);}fo(i, 1, n) geteql(i);fo(i, 2, n) {int x = SA[i - 1], y = SA[i];if (~height[i]) {if (x + height[i] <= n)larger[eql[y + height[i]]].push_back(eql[x + height[i]]);}x = SA[i - 1] + 1, y = SA[i] + 1;if (Rank[x] > Rank[y])larger[eql[SA[i]]].push_back(eql[SA[i - 1]]);}ans[eql[SA[1]]] = 'a';fo(i, 2, n){ans[eql[SA[i]]] = ans[eql[SA[i - 1]]]; // 处理 <=for (int x : larger[eql[SA[i]]]) // 处理 <if (ans[eql[x]] + 1 > ans[eql[SA[i]]])ans[eql[SA[i]]] = ans[eql[x]] + 1;}fo(i, 1, n) putchar(ans[geteql(i)]);puts("");
}

看似没改实则改了一堆, 更符合我的理解

总结

约束限制类问题, 考虑具体表示约束
一个误区是递归表示约束, 事实上字典序只需要一个位置更大即可, 不能递归约束

差分约束不够优秀时, 考虑转化成拓扑排序一类问题
注意常见的缩点思想

傳自我的手機:
我們的思想確有問題, 求真的同學們不要用 \(\rm{spfa}\) , 會影響你的數學思維, 三年一篇四大都沒有

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

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

相关文章

请问如何修改zblog的数据库连接信息以适应新的主机环境?

当您需要将zblog迁移到新的主机或更改数据库配置时,必须更新zblog的数据库连接信息。以下是详细的步骤和注意事项,确保您的博客能够顺利连接到新的数据库。找到配置文件: zblog的数据库配置文件位于zb_users/c_option.php。打开此文件,准备进行编辑。更新数据库连接参数: …

10M或100M带宽的服务器每个月可用的流量是多少?

选择合适的服务器带宽对于网站的性能和用户体验至关重要。了解不同带宽下的可用流量可以帮助您更好地规划资源,避免因流量不足而导致的服务中断。本文将详细介绍10M和100M带宽服务器每月的理论可用流量,并探讨实际使用中的影响因素。 1. 理论计算 根据带宽和时间的关系,我们…

如何在ASP页面中实现移动端与PC端的自动跳转?

在ASP页面中,可以通过检查HTTP_USER_AGENT字符串来判断客户端浏览器是否为移动设备,并根据结果进行相应的页面跳转。以下是详细的实现步骤和代码示例:检查HTTP_USER_AGENT字符串:HTTP_USER_AGENT是服务器接收到的请求头信息之一,包含了客户端浏览器的信息。 通过InStr函数…

如何在IIS中配置https重定向到http?

问题描述: 如何在IIS架构的服务器中配置https重定向到http? 答案: 将以下代码另存为web.config文件后保存到网站根目录即可生效。 <?xml version="1.0" encoding="UTF-8"?> <configuration><system.webServer><rewrite><r…

什么是IPMI及其在独立服务器中的作用?

IPMI的优势功能 描述提高效率 减少了对现场技术人员的依赖,加快问题解决速度。增强安全性 提供了额外的安全层,确保只有授权人员才能访问敏感信息。降低运营成本 避免了频繁派遣技术人员到现场,节省了时间和费用。简化管理 统一的管理界面使多台服务器的管理和维护变得更加简…

2024春秋杯冬季赛day3writeup_cyi

2024春秋杯冬季赛day3writeup_cyicyi WRITEUP 个人信息 个人名称:cyi 个人排名:112 解题情况解题过程 misc Infinity(fail) 操作内容: Png后藏zip,提出来随便解压几个发现是无限,解压缩有7z,zip,tar格式,gpt整个jio本 得到最后的secret文件,内容是Inf1nityIsS0CoOL,…

搭建本地大模型-ollama-conda

搭建大模型的前期工作构建本地大模型-ollama-conda 安装conda 环境 Win10LTSC 下载安装包 有两个版本,Anaconda3和Miniconda3。 两者的区别: 1、Anaconda3包含了很多库,Miniconda3只包含了基础库; 2、Anaconda3的安装包有Jupyter Notebook,Miniconda3没有。 建议: 刚入门…

[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(05):svg图片转为png格式(暨svg部件的使用)

前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。 iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。 本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。 环境配置 系统:window10 平台:visual…

春秋杯冬季赛-EzMisc WP

后面两天本来没打算写出来啥题的,因为都太难了呜呜,但是这道题竟然做出来了(虽然花了接近3个小时),还是有点小激动 前排提醒 1、是看了提示之后才做出来的题目提示:1、利⽤DP泄露来求出私钥,从⽽还原私钥流解密密⽂ 2、图片经过了Arnold变换2、存在偶然性,复现难度挺大…

信息量,熵,交叉熵,相对熵的定义

本文将介绍信息量,熵,交叉熵,相对熵的定义,以及它们与机器学习算法中代价函数的定义的联系。转载请保留原文链接:http://www.cnblogs.com/llhthinker/p/7287029.html 1. 信息量 信息的量化计算:解释如下:信息量的大小应该可以衡量事件发生的“惊讶程度”或不确定性: 如…

探索照片新艺术:在线将你的照片转为油画杰作

在数字时代,我们每天都在捕捉生活的瞬间,但你是否想过将这些平凡的照片转变为独一无二的艺术品?今天,我要向大家推荐一个令人兴奋的在线平台——img4you,它利用尖端的AI技术,让你的照片瞬间“穿上”油画的华服。 轻松体验在线照片转油画: https://www.img4you.com/style…

通俗理解深度学习中的熵相关知识【信息量、熵、相对熵(KL散度)、交叉熵】

https://zhuanlan.zhihu.com/p/647312079 通俗理解:一个事件从不确定变为确定的难度有多大 往往某件事情发生概率越低,信息量越大,从不确定变为确定的难度越大 ex:【中国队想要在世界杯夺冠】这一事件发生概率极极极低,信息量非常大,想要实现即“从不确定变为确定”的难度…