\(\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. 微服务架构攀登之路(三)之gRPC入门

    一.gRPC入门 1. gRPC 简介 gRPC 由 google 开发,是一款语言中立.平台中立.开源的远程过程调用系统 gRPC 客户端和服务端可以在多种环境中运行和交互,例如用 java 写一个 ...

  2. SYCOJ2140祝福短信

    题目-祝福短信 (shiyancang.cn) 1 #include<bits/stdc++.h> 2 using namespace std; 3 map<string,bool& ...

  3. 拉普拉斯平滑(Laplacian smoothing)

    概念 零概率问题:在计算事件的概率时,如果某个事件在观察样本库(训练集)中没有出现过,会导致该事件的概率结果是  $0$ .这是不合理的,不能因为一个事件没有观察到,就被认为该事件一定不可能发生(即该 ...

  4. dubbo泛化引发的生产故障之dubbo隐藏的坑

    dubbo泛化引发的生产故障之dubbo隐藏的坑 上个月公司zk集群发生了一次故障,然后要求所有项目组自检有无使用Dubbo编程式/泛化调用,强制使用@Reference生成Consumer.具体原因 ...

  5. Java中的常用类——Arrays

    数组工具类java.util.Arrays Arrays类中的方法都是static修饰的静态方法,因此可以直接使用类名.方法名来调用,而不用通过new使用对象来调用(是"不用"不是 ...

  6. 一种Django多租户解决方案

    什么是多租户? 多租户技术或称多重租赁技术,简称SaaS,是一种软件架构技术,是实现如何在多用户环境下(此处的多用户一般是面向企业用户)共用相同的系统或程序组件,并且可确保各用户间数据的隔离性. 多租 ...

  7. 解决Post请求中文乱码问题

    解决Post请求中文乱码问题 req.setChracterEncoding()要在获取请求参数前调用才有效,不然还是乱码

  8. ☕【Java深层系列】「并发编程系列」让我们一起探索一下CyclicBarrier的技术原理和源码分析

    CyclicBarrier和CountDownLatch CyclicBarrier和CountDownLatch 都位于java.util.concurrent这个包下,其工作原理的核心要点: Cy ...

  9. cp 不提示按y

    yes|cp index.html.j2   yml -rf \cp index.html.j2   yml/ 两个效果是一样的

  10. 了解promise、promise对象

    Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象. 所谓Pr ...