\(\mathcal{Description}\)

  给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序列数量。答案对 \((10^9+7)\) 取模。

  \(n\le5\times10^3\)。

\(\mathcal{Solution}\)

  一类题型一起写啦,再给出一道类似的题:

  给定字符串 \(s\),\(s_i\in\{\text{'R'},\text{'G'},\text{'Y'}\}\),每次允许交换相邻两个元素。求最少交换次数,使得 \(s\) 中不存在两个相邻元素相等,或声明无解。

  \(n\le400\)。

  不难看出它们都是 DP 题,但是若以从左到右的视角考虑问题,给定的操作具有强后效性,很难设计出一种靠谱的状态。

  这个时候可以奉行“拿来主义”(?),直接构造结果序列,将问题转化为把原序列上某值拿到结果序列的某位置的最小操作次数 / 方案数,再根据实际情况设计算法就很方便了。

  例如,对于求方案数的这题,令 \(f(i,j)\) 表示构造了结果序列的前 \(i\) 位,第 \(i\) 位用的是原序列的 \(p_j\) 的方案数。根据较大值不能覆盖较小值设计转移即可;对于最小化操作次数这题,令 \(f(i,r,g,k\in\{0,1,2\})\) 表示构造了结果序列前 \(i\) 位,用了 \(r\) 个 R,\(g\) 个 G,(\((i-r-g)\) 个 Y,)最后一个位置颜色为 \(k\) 的最小代价。转移利用类似冒泡排序的性质,在原序列里拿一个最近的颜色到当前位置即可。

\(\mathcal{Code}\)

  只给那道计数题的代码叭。

/*-Rainybunny-*/

#include <bits/stdc++.h>

#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) const int MAXN = 5e3, MOD = 1e9 + 7;
int n, a[MAXN + 5], lef[MAXN + 5], rig[MAXN + 5], f[2][MAXN + 5]; inline void addeq( int& u, const int v ) { ( u += v ) >= MOD && ( u -= MOD ); } inline void init() {
static int stk[MAXN + 5]; int top = 0;
rep ( i, 1, n ) {
while ( top && a[stk[top]] >= a[i] ) --top;
lef[i] = stk[top] + 1, stk[++top] = i;
}
stk[top = 0] = n + 1;
per ( i, n, 1 ) {
while ( top && a[stk[top]] >= a[i] ) --top;
rig[i] = stk[top] - 1, stk[++top] = i;
}
} int main() {
freopen( "C.in", "r", stdin );
freopen( "C.out", "w", stdout ); scanf( "%d", &n );
rep ( i, 1, n ) scanf( "%d", &a[i] ); init();
rep ( i, 1, n ) if ( lef[i] == 1 ) f[1][i] = 1;
for ( int sta = 1, i = 2; i <= n; sta ^= 1, ++i ) {
rep ( j, 1, n ) f[!sta][j] = rig[j] >= i ? f[sta][j] : 0;
int s = 0;
rep ( j, 1, n ) {
if ( lef[j] <= i && i <= rig[j] ) addeq( f[!sta][j], s );
addeq( s, f[sta][j] );
}
} int ans = 0;
rep ( i, 1, n ) addeq( ans, f[n & 1][i] );
printf( "%d\n", ans );
return 0;
}

Solution -「多校联训」I Love Random的更多相关文章

  1. Solution -「多校联训」排水系统

    \(\mathcal{Description}\)   Link.   在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...

  2. Solution -「多校联训」签到题

    \(\mathcal{Description}\)   Link.   给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...

  3. Solution -「多校联训」朝鲜时蔬

    \(\mathcal{Description}\)   Link.   破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面.   对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...

  4. Solution -「多校联训」消失的运算符

    \(\mathcal{Description}\)   Link.   给定长度为 \(n\) 的合法表达式序列 \(s\),其中数字仅有一位正数,运算符仅有 - 作为占位.求将其中恰好 \(k\) ...

  5. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  6. Solution -「多校联训」古老的序列问题

    \(\mathcal{Description}\)   Link.   给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...

  7. Solution -「多校联训」Sample

    \(\mathcal{Description}\)   Link   (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...

  8. Solution -「多校联训」光影交错

    \(\mathcal{Description}\)   Link.   一个游戏包含若干次卡牌抽取,每次以 \(p_l\) 的概率得到 \(+1\),\(p_d\) 的概率得到 \(-1\),否则得到 ...

  9. Solution -「多校联训」数学考试

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个函数,第 \(i\) 个有 \(f_i(x)=a_ix^3+b_ix^2+cx_i+d~(x\in[l_i, ...

随机推荐

  1. js 对 date 和 字符串 类型的正确互换【各浏览器兼容】,解决invalid Date

    1.前言 有个需求,想要把指定日期时间的字符串转换成date类型 pc浏览器正常转换,但手机浏览器 返回结果是 invalid Date [无效的日期] 2.原因 出现这样不兼容的原因其实很简单, p ...

  2. JavaWeb中Cookie会话管理,理解Http无状态处理机制

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512995108961387015/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...

  3. 一文搞懂Flink Window机制

    Windows是处理无线数据流的核心,它将流分割成有限大小的桶(buckets),并在其上执行各种计算. 窗口化的Flink程序的结构通常如下,有分组流(keyed streams)和无分组流(non ...

  4. SYCOJ157乘二加一

    题目-乘二加一 (shiyancang.cn) 递归写法 #include <bits/stdc++.h> using namespace std; string f(int n) { i ...

  5. 在asp.net webfrom 中完成用户自定义导出

    asp.net原生控件实现自定义列导出功能 自定义列实现 最近负责开发公司内部使用的人事信息化系统时,有一个需求是这样的,需要在页面中可以用户每次导出Excel时自定义需要导出哪些列,经过半天的琢磨和 ...

  6. 谷歌性能测评工具lighthouse使用

    1.谷歌插件lighthouse的基本介绍 Lighthouse 是一个网站性能测评工具, 它是 Google Chrome 推出的一个开源自动化工具,能够对 PWA 和网页多方面的效果指标进行评测, ...

  7. List转换Map的三种方式

    1.for循环 ... 2.使用guava Map<Long, User> maps = Maps.uniqueIndex(userList, new Function<User, ...

  8. Genymotion模拟器配置与使用

    1.https://www.genymotion.com网站注册模拟器账号,并按照指引激活账号 此过程中提示商业用还是个人使用,商业使用需要有注册码,个人使用不需要注册码,我选择的是个人使用. 2.激 ...

  9. 源代码管理git地址从http改为https,提交400错误

    推送400错误 cmd 执行 git config --global http.sslVerify false 推送地址,修改http 为 https 就可以正常提交了

  10. [Raspberry Pi] 入门使用

    今天开始介绍Raspberry Pi(简称RPi,下同)入门的一些基础知识. 第1部分: 安装RPi 1.1  从 http://www.raspberrypi.org/downloads 下载RPi ...