ARC127E Priority Queue

分析性质+dp。

思路

由于每次加入的数肯定是一个 \(a\) 的排列,但这个角度不好考虑。

设 \(\{a\}\) 为最终状态的集合,其中 \(a_i<a_{i+1}\),显然集合内元素个数为 \(A-B\)。

然后可以发现,按照元素值升序的加入顺序形成最终状态一定是最保险的一种方案。

设 \(a_{i+1},a_i\) 加入的顺序可以形成该最终状态,试交换顺序为 \(a_i,a_{i+1}\)。

  • 因为 \(a_i<a_{i+1}\) 所以 \(a_i\) 可以留下。

  • 因为 \(a_{i+1},a_i\) 的顺序可以形成最终状态,所以 \(a_i,a_{i+1}\) 也可以形成最终状态。

所以如果乱序加入的状态可以留下 \(a_i,a_{i+1}\),那么升序加入一定可以留下。

那么我们可以发现,最后留下的顺序是升序的,就可以考虑 \(dp\)。

设 \(dp[i][j]\) 为目前已经放了 \(i-1\) 个数,第 \(i\) 个数放 \(j\) 的状态数。

有转移:

\[dp[i][j]=\sum_{k=1}^{j-1} dp[i-1][k]
\]

可以用前缀和优化转移,时间复杂度 \(O(n^2)\)。

CODE

#include<bits/stdc++.h>
using namespace std; #define ll long long
#define mod 998244353 const int maxn=5005; int n,a,b,t,m;
int r[maxn]; ll dp[maxn][maxn],s[maxn][maxn]; int main()
{
scanf("%d%d",&a,&b);
for(int i=1;i<=a+b;i++)
{
int x;
scanf("%d",&x);
if(x==1) r[++t]=++m;
else t--;
}
dp[0][0]=1;
for(int i=0;i<=a;i++) s[0][i]=1;
for(int i=1;i<=a-b;i++)
{
for(int j=1;j<=r[i];j++)
dp[i][j]=s[i-1][j-1],s[i][j]=(dp[i][j]+s[i][j-1])%mod;
for(int j=r[i]+1;j<=a;j++) s[i][j]=s[i][r[i]];
}
printf("%lld",s[a-b][r[a-b]]);
}

ARC127E Priority Queue的更多相关文章

  1. STL-<queue>-priority queue的使用

    简介: 优先队列是一种容器适配器,优先队列的第一个元素总是最大或最小的(自定义的数据类型需要重载运算符).它是以堆为基础实现的一种数据结构. 成员函数(Member functions) (const ...

  2. 优先队列(Priority Queue)

    优先队列(Priority Queue) A priority queue must at least support the following operations: insert_with_pr ...

  3. Objective-C priority queue

    http://stackoverflow.com/questions/17684170/objective-c-priority-queue PriorityQueue.h // // Priorit ...

  4. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅴ

    命题Q.对于一个含有N个元素的基于堆叠优先队列,插入元素操作只需要不超过(lgN + 1)次比较,删除最大元素的操作需要不超过2lgN次比较. 证明.由命题P可知,两种操作都需要在根节点和堆底之间移动 ...

  5. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅳ

    2.4.4 堆的算法 我们用长度为 N + 1的私有数组pq[]来表示一个大小为N的堆,我们不会使用pq[0],堆元素放在pq[1]至pq[N]中.在排序算法中,我们只能通过私有辅助函数less()和 ...

  6. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅰ

    许多应用程序都需要处理有序的元素,但不一定要求他们全部有序,或者是不一定要以此就将他们排序.很多情况下我们会手机一些元素,处理当前键值最大的元素,然后再收集更多的元素,再处理当前键值最大的元素.如此这 ...

  7. 什么是优先级队列(priority queue)?

    有时候我们需要在某个元素集合中找到最小值和最大值 .优先级队列抽象数据(Priority Queue ADT)模型是我们能够使用的方法之一,这是一种支持插入和删除最小值(DeleteMin)或者最大值 ...

  8. 优先队列Priority Queue和堆Heap

    对COMP20003中的Priority queue部分进行总结.图片来自于COMP20003 queue队列,顾名思义特点先进先出 priority queue优先队列,出来的顺序按照优先级prio ...

  9. STL之heap与优先级队列Priority Queue详解

    一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的m ...

  10. Priority Queue

    优先队列 集合性质的数据类型离不开插入删除这两操作,主要区别就在于删除的时候删哪个,像栈删最晚插入的,队列删最早插入的,随机队列就随便删,而优先队列删除当前集合里最大(或最小)的元素.优先队列有很多应 ...

随机推荐

  1. vscode注释快捷键

    单行注释 ctrl+/ 多行注释 ctrl+alt+a 文档注释 /** 复制上面一行 ctrl+d 选中段落整体向左或向右缩进 ctrl +[ 或 ctrl + ] 查找 ctrl + f

  2. idea下spring切换jdk版本

    1.首先打开项目配置设置 2. 修改project中的配置 3. 修改modules中的配置 这个方法不需要修改pom.xml文件 如果有问题请指正   及时修改 2022年9月10日16:42:16

  3. c# 复制文件夹内所有文件到另外一个文件夹

    /// <summary> /// 开始转移 /// </summary> /// <param name="sender"></para ...

  4. 使用 nuxi add 快速创建 Nuxt 应用组件

    title: 使用 nuxi add 快速创建 Nuxt 应用组件 date: 2024/8/28 updated: 2024/8/28 author: cmdragon excerpt: 通过使用 ...

  5. 检测 NAT 类型

    使用 pystun3 pystun3 是一个用于获取 NAT 类型和外部 IP 的 Python STUN 客户端 安装: pip install pystun3 使用: pystun3 结果: NA ...

  6. 微信小程序开发工具怎样支持xdebug调试

    在做PHP项目时候用xdebug进行调试,如果使用浏览器我一般直接 Xdebug Helper 浏览器插件.配合PHPSTORM进行调试. 微信小程序并不支持cookies,因此需要另想办法,可以在微 ...

  7. 6.24.2 数据库&漏洞口令&应急取证

    windows日志分析神器 logonTracer-外内网日志 github下载:#JPCERTCC/LogonTracer:通过可视化和分析 Windows 事件日志来调查恶意 Windows 登录 ...

  8. 为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义?

    为什么在 C++ 中,类的静态成员变量需要在源文件中进行定义? 类的静态成员变量需要在源文件中进行定义,以便在链接阶段能够正确地分配内存并为其分配地址. 当你在类的头文件中声明一个静态成员变量时,这只 ...

  9. tailwindcss 经验

    树摇时扫描的文件范围 根据 tailwindcss.config.js 中 content 的配置,跟打包软件加载的模块无关.即未使用的模块中的 class 也会被包含进来.

  10. JavaScript——案例-表单验证

    需求       <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...