[AGC012F]Prefix Median
题目大意:
给定一个长度为$2n-1(n\le50)$的数组$a$,可以重排$a$中的元素,生成一个长度为$n$的数组$b$,其中$b_i$为$a_1\sim a_{2i-1}$的中位数。求对于给定的$a$能生成多少种不同的$b$。
思路:
对$a$进行排序,转化题意。求满足以下3个条件的长度为$n$的数列$b$的个数:
1.$b_i\in\{a_i,a_{i+1},\ldots,a_{2n-i}\}$;
2.对于$(i<j)$,不存在$b_i<b_j<b_{i+1}$;
3.对于$(i<j)$,不存在$b_i>b_j>b_{i+1}$。
用$f[i][j][k]$表示考虑$b$的第$i$位,比它小的可选数有$j$种,比它大的可选数有$k$种。即可用动态规划求得。
每次转移设$l=[a_i\ne a_{i-1}],r=[a_{m-i+1}\ne a_{m-i+2}]$,对应条件1,表示当前转移可以新填的数。若$a_i=a_{i-1}$或$a_{m-i+1}=a_{m-i+2}$则说明不会增加新填的数。
转移1:$f[i-1][j+l][k+r]+=f[i][j][k]$,即当前填的数还是上次的数,但是两边各多出$l$或$r$个可以填。
转移2:$f[i-1][t][k+r+1]+=f[i][j][k](t<j+l)$,表示若将当前填的数变小,左边还剩$t$个可以填,这里本来填的变成了右边的。
转移3:$f[i-1][j+l+1][t]+=f[i][j][k](t<k+r)$,表示若将当前填的数变大,右边还剩$t$个可以填,这里本来填的变成了左边的。
状态$O(n^3)$,转移$O(n)$,时间复杂度$O(n^4)$。
#include<cstdio>
#include<cctype>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
constexpr int mod=1e9+;
constexpr int N=,M=;
int a[N],f[N][M][M];
int main() {
const int n=getint(),m=n*-;
for(register int i=;i<=m;i++) a[i]=getint();
std::sort(&a[],&a[m]+);
f[n][][]=;
for(register int i=n;i>;i--) {
const bool l=a[i]!=a[i-],r=a[m-i+]!=a[m-i+];
for(register int j=;j<=m;j++) {
for(register int k=;k<=m;k++) {
if(!f[i][j][k]) continue;
(f[i-][j+l][k+r]+=f[i][j][k])%=mod;
for(register int t=;t<j+l;t++) {
(f[i-][t][k+r+]+=f[i][j][k])%=mod;
}
for(register int t=;t<k+r;t++) {
(f[i-][j+l+][t]+=f[i][j][k])%=mod;
}
}
}
}
int ans=;
for(register int i=;i<=m;i++) {
for(register int j=;j<=m;j++) {
(ans+=f[][i][j])%=mod;
}
}
printf("%d\n",ans);
return ;
}
[AGC012F]Prefix Median的更多相关文章
- 【AtCoder】【DP】【思维】Prefix Median(AGC012)
模的是这位神犇的代码:Atcoder AGC012F : Prefix Median 题意: 在动态中位数那道题上做了一些改动.给你一个序列a,可以将a重新任意排序,然后对于a序列构造出b序列. 假设 ...
- Solution -「AGC 012F」「AT 2366」Prefix Median
\(\mathcal{Description}\) Link. 给定序列 \(\{a_{2n-1}\}\),将 \(\{a_{2n-1}\}\) 按任意顺序排列后,令序列 \(b_i\) 为前 ...
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- 【AtCoder】AGC012
AGC012 A - AtCoder Group Contest 从最后开始间隔着取就行 #include <bits/stdc++.h> #define fi first #define ...
- A♂G&C012
A♂G&C012 A AtCoder Group Contest 从大到小sort后输出\(a_2+a_4+a_6+\ldots a_{2n}\) 好♂啊,只会背结论/kk B Splatte ...
- AtCoder练习
1. 3721 Smuggling Marbles 大意: 给定$n+1$节点树, $0$为根节点, 初始在一些节点放一个石子, 然后按顺序进行如下操作. 若$0$节点有石子, 则移入盒子 所有石子移 ...
- Spring配置文件标签报错:The prefix "XXX" for element "XXX:XXX" is not bound. .
例如:The prefix "context" for element "context:annotation-config" is not bound. 这种 ...
- No.004:Median of Two Sorted Arrays
问题: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the ...
- [LeetCode] Find Median from Data Stream 找出数据流的中位数
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
随机推荐
- recycleview的基础Adapter
.封装了一个基础的adapter.,用于recycleview的快捷使用有BaseAdapter,BaseViewHolder,PAdapter,MainActivity public abstrac ...
- fscanf函数的应用
转摘自:http://blog.csdn.net/mxgsgtc/article/details/13005675 以前老是被从文本里读取文件,然后逐个的进行字符解析,感觉非常的慢,自从知道了fsca ...
- ListView使用--文章集锦
详解ListView加载网络图片的优化,让你轻松掌握! ListView具有多种item布局--实现微信对话列 关注公众号,分享干货,讨论技术
- python读写Excel文件_xlrd模块读取,xlwt模块写入
一.安装xlrd模块和xlwt模块(服务器) 1. 下载xlrd模块和xlwt模块 到python官网http://pypi.python.org/pypi/xlrd下载模块.下载的文件例如:xlrd ...
- 【BZOJ2440】完全平方数 [莫比乌斯函数]
完全平方数 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 小X自幼就很喜欢数. 但奇怪的是 ...
- loj6100 「2017 山东二轮集训 Day1」第一题
传送门:https://loj.ac/problem/6100 [题解] 我们考虑维护从某个端点开始的最长满足条件的长度,如果知道了这个东西显然我们可以用主席树来对每个节点建棵关于右端点的权值线段树, ...
- MyBatis系列四 之 智能标签进行查询语句的拼接
MyBatis系列四 之 智能标签进行查询语句的拼接 使用Foreach进行多条件查询 1.1 foreach使用数组进行多条件查询 在MyBatis的映射文件中进行如下配置 <!--根据数组进 ...
- bzoj 1060 贪心
设根到每个叶子节点的距离为dis,比较容易的看出来,我们需要把这颗树的所有叶子节点的值都变成其中最大的内个,我们设为max,那么对于一颗子树来说,设其中dis值最大的为x,我们需要将这个子树根节点和子 ...
- 【 浅谈Linux路由机制 】
以下均为个人实验验证结果,如有问题,恳请指正. 现在服务器一般都有四张网卡,给了我们更多网络模型的选择.为了业务的需求,有时我们需要如下网络架构 系统:centos 7.2 x64 两张网卡不在同一个 ...
- 【C++】嵌套类、友元
黄邦勇帅 里面关于嵌套类的介绍我有疑惑.里面11.9说在创建一个外围类的对象时先执行嵌套类的构造函数然后再执行外围类的构造函数,析构函数则以相反的方式执行. 可是我编程实验了一下,创建外围类对象时并不 ...