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. LCD屏幕显示PNG图像

    正点原子LCD屏幕显示PNG图像 本文概要 这段时间在学习正点原子的IMX6ULL开发板,在应用编程中有一个代码练习是需要在LCD屏幕上显示PNG图像,但由于我的屏幕参数和教程中的有些出入,于是经过自 ...

  2. 击败全球上千参赛队伍,合合信息获ICDAR“文本篡改检测”赛道冠军

    AI技术的快速发展激发了人们对于美好未来的畅享,也带来了潜在的危机,数据泄露.电信诈骗等系列风险与隐患开始浮出水面.利用科技手段构建可信的技术发展环境,保护使用者的信息及财产安全,正在成为行业共识. ...

  3. 加入 Flutter Engage,Pick 您的专属 Dash 形象!

    Flutter Engage 活动精彩来袭 对 Flutter 团队的开发者们来说,交流的重要性不言而喻,和您一样,我们也希望开发者们能够在不同的情境下进行互动分享.于是我们为您准备了一场特别的线上活 ...

  4. FFmpeg开发笔记(五十三)移动端的国产直播录制工具EasyPusher

    ​EasyPusher是一款国产的RTSP直播录制推流客户端工具,它支持Windows.Linux.Android.iOS等操作系统.EasyPusher采用RTSP推流协议,其中安卓版EasyPus ...

  5. flink 大批量任务提交 yarn 失败问题

    问题现象 用户迁移到新集群后,反馈他们开发平台大量 flink 任务提交失败了,当时集群的 yarn 资源是足够的 排查过程 用户是在他们的开发平台上提交的,查看他们失败的任务,发现是他们提交端主动 ...

  6. 【翻译】实现 Blocked Floyd-Warshall 用于解决所有对最短路径问题 C# 实现

    介绍 在之前的帖子中,我们实现了Floyd-Warshall(弗洛伊德-沃沙尔算法)(四种变体)以及路由重建算法.在这些帖子中,我们探讨了所有对最短路径问题的基本概念.内存中的数据表示.并行性.向量化 ...

  7. iOS Masonry使用小结

    一.Masonry简介 Masonry是一个轻量级的布局框架,它拥有自己的描述语法(采用更优雅的链式语法封装)来自动布局,具有很好可读性且同时支持iOS和Max OS X等. 二.Masonry的基本 ...

  8. MongoDB安装及配置Navicat MongoDB Tools

    一.下载MongoDB 1.下载网址:https://www.mongodb.com/try/download/community 注:本文档以Windows和msi安装为例 二.安装MongoDB ...

  9. 用自定义功能区完成Excel两种颜色的交错填充

    今天需要用Excel中的填充颜色完成两种颜色的交错填充 在excel中,选择一个颜色填充后,再切换到另一个颜色,再点击填充.操作起来会显得比较笨重 于是萌生了一个想法,是否可以通过Excel的自定义功 ...

  10. Transformer的Pytorch实现【1】

    使用Pytorch手把手搭建一个Transformer网络结构并完成一个小型翻译任务. 首先,对Transformer结构进行拆解,Transformer由编码器和解码器(Encoder-Decode ...