[AGC056B] Range Argmax

news/2024/10/4 8:15:26

发现一个序列 \(x\) 不止可以用一个 \(p\) 得到,肯定不能直接计数,考虑构造一个映射。

假如已经定下了 \(x\),我们通过一种固定的操作得到 \(p\),这样就能改为统计可以由操作得到的 \(p\) 的数量,他们同样唯一对应一个 \(x\)

我们考虑枚举从 \(n\)\(1\) 去枚举 \(v\),对每个 \(v\) 找到一个能找到的最左边的点赋值。一个位置 \(pos\) 能赋值 \(v\) 当且仅当所有 \(l_i,r_i\) 包含 \(pos\)\(x_i\) 等于 \(pos\)

接下来我们就可以处理左区间和右区间的位置了。容易发现其右边的值都要小于左边的值,这将变成两个子问题。

现在 \(x\) 并不固定,我们需要分析条件才能计数。

注意到,若当前我们在 \(pos\) 这里赋值,那么对于左侧的最大值的位置 \(k\),一定存在一个区间满足 \(l_i\le k\le pos\le r_i\),因为若没有区间同时包含 \(k,pos\),那么显然我可以让 \(p_{pos}=v\),所以一定存在这样的区间。之所以存在这种情况那只能是因为这个区间的 \(x_i\) 等于 \(pos\)。我们需要用一个大数在这里填,填完以后再将区间删去才能更新 \(k\)

这启发我们进行一个区间 dp,设 \(f_{l,r,i}\) 表示在区间 \(l,r\) 中最大值位置在 \(i\) 的方案数。但是由于这样子复杂度很劣,我们将状态改为在区间 \(l,r\) 中最大值位置大于等于 \(i\) 的方案数就能 \(\mathcal{O}(n^3)\) 解决问题了,具体就是先维护区间如果要选 \(pos\) 赋值,包含 \(pos\) 的区间的最小 \(l_i\),然后再后缀和转移即可。

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i, l, r) for (int i = l; i <= r; ++ i)
#define rrp(i, l, r) for (int i = r; i >= l; -- i)
#define pii pair <int, int>
#define eb emplace_back
#define id(x, y) n * (x - 1) + y
#define ls p << 1
#define rs ls | 1
using namespace std;
constexpr int N = 300 + 5, M = (1ll << 31) - 1, P = 998244353;
constexpr double PI = acos (-1.0);
inline int rd () {int x = 0, f = 1;char ch = getchar ();while (! isdigit (ch)) {if (ch == '-') f = -1;ch = getchar ();}while (isdigit (ch)) {x = (x << 1) + (x << 3) + ch - 48;ch = getchar ();}return x * f;
}
int qpow (int x, int y) {int ret = 1;for (; y; y >>= 1, x = x * x % P) if (y & 1) ret = ret * x % P;return ret;
}
int f[N][N][N], g[N][N][N];
int n, m;
long long fac[N], ifac[N];
int C (int n, int m) {if (m < 0 || m > n) return 0;return fac[n] * ifac[m] % P * ifac[n - m] % P;
}
int l[N * N], r[N * N];
signed main () {// freopen ("1.in", "r", stdin);// freopen ("1.out", "w", stdout);n = rd (), m = rd ();rep (i, 1, m) l[i] = rd (), r[i] = rd ();rep (i, 0, n + 1) rep (j, 0, n + 1) rep (k, 0, n + 1) g[i][j][k] = n + 1;rep (i, 1, m) {rep (j, l[i], r[i]) {g[l[i]][r[i]][j] = min (g[l[i]][r[i]][j], l[i]); }}rep (len, 1, n) {rep (l, 1, n - len + 1) {int r = l + len - 1;rep (k, 1, n) g[l][r][k] = min (g[l][r][k], min (g[l + 1][r][k], g[l][r - 1][k]));}}rep (l, 1, n + 1) rep (k, 1, n + 1) f[l][l - 1][k] = 1;rep (len, 1, n) {rep (l, 1, n - len + 1) {int r = l + len - 1;rrp (k, l, r) {(f[l][r][k] += f[l][r][k + 1] + f[l][k - 1][g[l][r][k]] * f[k + 1][r][k + 1]) %= P;}}} cout << f[1][n][1];
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Cisco Secure Network Analytics 7.5.1 发布下载,新增功能概览

Cisco Secure Network Analytics 7.5.1 发布下载,新增功能概览Cisco Secure Network Analytics 7.5.1 发布下载,新增功能概览 Cisco Secure Network Analytics 7.5.1 - 领先的网络检测和响应 (NDR) 解决方案 Secure Network Analytics (formerly Stealthwatch) - Network Vis…

C++ lambda 捕获列表

▲《C++ Primer》 P352

读数据湖仓06数据集成

读数据湖仓06数据集成1. 数据湖仓中的数据集成 1.1. 数据湖仓的总体目标是为每一个人提供支持,包括从普通职员到CEO 1.2. 有了作为基础设施的基础数据,企业等组织才能实现真正的数据驱动 1.3. 提供组织所需的数据,最关键的一环在于提供集成的数据基础1.3.1. 只将数据扔进数据…

MSYS2 环境使用

在 Windows 环境下使用 rusqlite 库碰到了报错:由于 Windows 环境不如 Ubuntu 那样一个 apt install libsqlite3-dev 解决问题,所以采用 MSYS2 来从根源解决问题。 安装MSYS2 官网: WEB PAGE MSYS2 代理镜像下载地址:无 由于 MSYS2 自带的有国内镜像,所以按理说下载好无需配…

Echoism

Echoing reality Are your memories of me? Floating through a state, half asleep, never awake(never awake) I wont breathe in eternity Carrying your secrets feeling close to who you are Youre just beyond my reach A passing breeze, And your final moments se…

快乐数学1培养数学直觉

1 培养数学直觉我们最初接触一个概念时,会形成我们的直觉。而我们的直觉会影响我们对一门学科的喜爱程度。什么意思呢? 假设我们想给 “猫 ”下一个定义:古代的定义: 一种毛茸茸的动物,有爪子、牙齿、尾巴和四条腿,高兴时发出咕噜声,生气时发出嘶嘶声。 进化定义: 某一…

SciTech-Mathmatics-Markdown:List 嵌入 code block + LaTex: 论文写作、排版与使用 + 数学公式的输入方式

民主与共和 更好的共和度保障更高级的民主, 是因为 民主 与 共和 是统一的。 平衡态的“跃迁”是需要“吸收足够能量”, "改变"总是需要"成本"的。 在正确的方向上,每一天的学习是“质变飞跃”的必要。Markdown: List 嵌入 code block Code is possible …

简单讲讲上下界网络流

无源汇可行流 无源汇网络流一般不讨论最大流,因为它的流都是环流,分布在各个位置,一是不好统计,二是一般也没有意义。所以一般建图只需要求是否有可行解(但我也没遇到过求输出YES和NO的可行流题目,网上的博客也都只当做有源汇的前置知识讲了) 废话不多说,直接上图。第一…