[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 ...
随机推荐
- Google MapReduce中文版
英文原文链接: Google Map Reduce 译文原文链接: Google MapReduce中文版 Google MapReduce中文版 译者: alex 摘要 MapReduce是一个编程 ...
- Ubuntu 编译Webkit --gtk
转载自:http://www.linuxidc.com/Linux/2011-10/44809.htm webkit是一个浏览器内核,google的chrome就是基于它的,下面介绍一下如何在Ubun ...
- CentOS 6.5 Linux 安装 openoffice
资源准备: Apache_OpenOffice_4.1.4_Linux_x86-64_install-rpm_zh-CN.tar.gz 编译安装: 本人资源包放在 /opt/moudles 中, 解压 ...
- CodeForces - 682B 题意水题
CodeForces - 682B Input The first line of the input contains a single integer n (1 ≤ n ≤ 100 000) — ...
- bzoj 5028: 小Z的加油店——带修改的区间gcd
Description 小Z经营一家加油店.小Z加油的方式非常奇怪.他有一排瓶子,每个瓶子有一个容量vi.每次别人来加油,他会让 别人选连续一段的瓶子.他可以用这些瓶子装汽油,但他只有三种操作: 1. ...
- 【洛谷】P1648 看守 (数学)
题目链接 直接暴力搞\(O(n^2)\)显然是布星滴. 试想,若是一维,最远距离就是最大值减最小值. 现在推广到二维,因为有绝对值的存在,所以有四种情况 \((x1+y1) - (x2+y2), (x ...
- 2017年上海金马五校程序设计竞赛:Problem B : Sailing (广搜)
Description Handoku is sailing on a lake at the North Pole. The lake can be considered as a two-dime ...
- bzoj 1880 最短路
我们首先知道,答案肯定是最短路图中的某段公共链,那么设(x,y)为x到y的最短路,那么答案为((s1,t1)+(s2,t2)-min((s1,s2)+(t1,t2),(s1,t2),(s2,t1))) ...
- Kuangbin 带你飞 KMP扩展KMP Manacher
首先是几份模版 KMP void kmp_pre(char x[],int m,int fail[]) { int i,j; j = fail[] = -; i = ; while (i < m ...
- decimal数据类型
DECIMAL(N,M)中M是小数部分的位数,若插入的值未指定小数部分或者小数部分不足M位则会自动补到M位小数,若插入的值小数部分超过了M为则会发生截断,截取前M位小数. N是整数部分加小数部分的总长 ...