\(\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. 第10组 Alpha冲刺 (1/6)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/ ·作业博客:https://edu.cnblogs.com/campus/fzu/FZ ...

  2. SSM简单实现文件上传和下载

    一.配置spring-mvc <!-- 配置多媒体文件解析器 --> <bean id="multipartResolver" class="org.s ...

  3. JAVA-JDK1.7-ConCurrentHashMap-源码并且debug说明

    概述 在一个程序员的成长过程就一定要阅读源码,并且了解其中的原理,只有这样才可以深入了解其中的功能,就像ConCurrentHashMap 是线程安全的,到底是如何安全的?以及如何正确使用它?reha ...

  4. RocketMQ架构原理解析(四):消息生产端(Producer)

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  5. 利用栈实现括号匹配(python语言)

    原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...

  6. C#进阶——记一次USB HID的各种坑(x86,x64,win10,win7)

    一.简叙 写工控上位机的搬砖人,难免会遇到USB通讯,在一个项目中,我写的上位机使用USB HID协议和STM32通讯传输数据,从零大概花了几天找例程,找资料,最后是各种搬砖修补,终于出来了一个出版D ...

  7. 【刷题-PAT】A1095 Cars on Campus (30 分)

    1095 Cars on Campus (30 分) Zhejiang University has 8 campuses and a lot of gates. From each gate we ...

  8. List子接口

    简介 特点: 有序, 有下标, 元素可以重复 常用方法 boolean add(E e) 将指定的元素追加到此列表的末尾(可选操作). void add(int index, E element) 将 ...

  9. for each ……in

    使用一个变量迭代一个对象的所有属性值,对于每一个属性值,有一个指定的语句块被执行. 作为ECMA-357(E4X)标准的一部分,for each...in语句已被废弃,E4X中的大部分特性已被删除,但 ...

  10. gin中绑定html复选框

    main.go package main import "github.com/gin-gonic/gin" type myForm struct { Colors []strin ...