网站开发后期工作包括那两个部分,电子商城网站建设的实训内容记述,网站模板使用教程,个人网站的内容正题
题目链接:https://www.luogu.com.cn/problem/AT2366 题目大意
有一个长度为2n−12n-12n−1的序列aaa#xff0c;你可以将其重新排列#xff0c;定义bib_ibi为a1∼2i−1a_{1\sim 2i-1}a1∼2i−1的中位数。
询问有多少种不同的可能的bbb序列。 1≤n≤501\leq n\leq…正题
题目链接:https://www.luogu.com.cn/problem/AT2366 题目大意
有一个长度为2n−12n-12n−1的序列aaa你可以将其重新排列定义bib_ibi为a1∼2i−1a_{1\sim 2i-1}a1∼2i−1的中位数。
询问有多少种不同的可能的bbb序列。
1≤n≤501\leq n\leq 501≤n≤50 解题思路
先假设aaa中所有数字都不同我们去考虑一下bbb的限制。
相当于我们每次在aia_iai中加入两个数字x,yx,yx,y然后如果x,yx,yx,y都小于最后一个bbb则新的bbb取它在aaa中的前驱如果都大于则取后继如果一大一小则不动。
基于这个限制我们得到的条件是每次bib_ibi加入数字之后的排名只能变动一位这是充要的。
考虑去形式化这个条件将aaa排序后我们有
an−i1≤bi≤ani−1a_{n-i1}\leq b_i\leq a_{ni-1}an−i1≤bi≤ani−1不存在jijiji满足bibjbi1b_ib_jb_{i1}bibjbi1或bi1bjbib_{i1}b_jb_ibi1bjbi
这样我们其实并不需要考虑aaa填的情况如果bbb一次向外跨过了很多个aaa那么我们可以视这些aaa此时还没有加入我们只需要限制往内跨的情况出现就好了。
不过这第二个条件依旧不好处理我们考虑倒着做那当我们确定一个bib_ibi和bi1b_{i1}bi1之后相当于(bi,bi1)(b_i,b_{i1})(bi,bi1)之间的数字就都不能选择了。
考虑dpdpdp设fi,l,rf_{i,l,r}fi,l,r表示目前填了iii个对于现在的bib_ibi来说左边还剩下lll个位置右边还剩下rrr个位置。
然后每次加入两边的aia_iai如果alal1a_{l}a_{l1}alal1那么我们将其视为同一个右边同理。
时间复杂度O(n4)O(n^4)O(n4) code
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N110,P1e97;
ll n,m,a[N],f[N][N][N];
signed main()
{scanf(%lld,n);m2*n-1;for(ll i1;im;i)scanf(%lld,a[i]);sort(a1,am1);f[n][0][0]1;for(ll in-1;i1;i--){ll li,r2*n-i;ll dl(a[l]!a[l1]),dr(a[r]!a[r-1]);for(ll l0;lm;l)for(ll r0;rm;r){if(!f[i1][l][r])continue;(f[i][ldl][rdr]f[i1][l][r])%P;for(ll k0;kldl;k)(f[i][k][rdr1]f[i1][l][r])%P;for(ll k0;krdr;k)(f[i][ldl1][k]f[i1][l][r])%P;}}ll ans0;for(ll i0;im;i)for(ll j0;jm;j)(ansf[1][i][j])%P;printf(%lld\n,ans);return 0;
}