首页 > 其他分享 >[JOISC2020] 最古の遺跡 3

[JOISC2020] 最古の遺跡 3

时间:2023-12-20 11:25:34浏览次数:29  
标签:le 前缀 最古 石柱 样例 JOISC2020 times 遺跡 dp

[JOISC2020] 最古の遺跡 3

题目背景

JOI 教授是一名研究 IOI 王国的历史学家。

题目描述

他发现了一行古代石柱的废墟及一份古代文献。

古代文献上的记载如下:

  • 刚建造完成的时候,有 \(2\times N\) 个石柱,对于 \(1\le k\le N\) 均有两个石柱高度为 \(k\),同时记第 \(i\) 个石柱的高度为 \(h_i\)。
  • 会发生 \(N\) 次地震,每次地震会使一些石柱的高度 \(-1\),其他石柱高度不变。
  • 石柱 \(i\) 地震时高度不变,当且仅当 \(h_i\ge 1\) 并且对于 \(j>i\) 都要有 \(h_i\not=h_j\)
  • \(N\) 次地震后,恰好只剩下了 \(N\) 个石柱。

现在 JOI 教授找出了仅存的 \(N\) 个石柱的位置 \(A_1,A_2,\ldots,A_N\),他想让你求出,最初 \(2\times N\) 个石柱高度的修建方案数 \(\bmod~10^9+7\) 的值。

输入格式

第一行为一个整数 \(N\)。

接下来一行 \(N\) 个数,表示 \(A_1,A_2,\ldots,A_N\)。

输出格式

仅一行一个整数,表示最初 \(2\times N\) 个石柱高度的建造方案数 \(\bmod~10^9+7\) 的值。

样例 #1

样例输入 #1

3
3 4 6

样例输出 #1

5

样例 #2

样例输入 #2

1
1

样例输出 #2

0

样例 #3

样例输入 #3

10
5 8 9 13 15 16 17 18 19 20

样例输出 #3

147003663

提示

样例解释

样例 1 解释

一种可行的解为 \((2,2,3,3,1,1)\)。

  • 第一次地震后,变为 \((1,2,2,3,0,1)\)。
  • 第二次地震后,变为 \((0,1,2,3,0,1)\)。
  • 第三次地震后,变为 \((0,0,2,3,0,1)\)。

另外四种解如下:

  • \((2,3,2,3,1,1)\)。
  • \((2,3,3,2,1,1)\)。
  • \((3,2,2,3,1,1)\).
  • \((3,2,3,2,1,1)\)。

样例 2 解释

对于 \(N=1\) 的情况,显然只有 \((1,1)\) 一种修建方案,在一次地震后,会变为 \((0,1)\),\(1\) 号位置不可能有石柱。

样例 3 解释

共有 \(111147004440\) 种可能的修建方案,\(111147004440 \bmod 10^9+7=147003663\)。

子任务

对于 \(100\%\) 的数据,保证 \(1\le N\le 600\),\(1\le A_i\le 2\times N\),\(A_i< A_{i+1}\)。

Subtask 编号 \(N\le\) 分数
\(1\) \(13\) \(6\)
\(2\) \(60\) \(52\)
\(3\) \(42\)

先强制钦定两个相同高度的是不一样的,最后再除回去。 ``
先想在给出 \(h\) 的情况下,如何不模拟找到 \(A\)。

看题解可知倒序枚举 \(h\)。用一个 \(vs\) 数组表示在最终态时有哪些数出现过(容易发现每种数最多出现一次)。如果 \(vs_{h_i}\),那么\(h_i\) 至少被减了一次,\(--h_i\),直到 \(h_i=0\) 或者他没有出现过。如果没有出现过,那么他不可能被删除,这个位置就属于 \(A\)。

那么现在给出了 \(A\),我们要倒退回原来的 \(h\) 的方案数。容易状压 \(n2^n\)。考虑给某一个 不在 \(A\) 的数填的时候有多少种方案。考虑维护 \(vs\) 数组的信息,他不在 \(A\) 中说明他在 \(vs\) 数组的前缀1中。那么就记录前缀1的数量。定义 \(f _{i,j}\) 表示考虑到倒数第 \(i\) 个数,\(vs\) 数组前缀有 \(j\) 个1的方案数。那么如果后面有 \(c\) 个数是不属于 \(A\) 的,就有 \(j-c\) 种方案。

现在看如果倒数第 \(i\) 个数是在 \(A\) 中的,那现在有两种情况。一种是前缀1的个数没有改变,那么这里的系数之后再考虑。如果前缀1的个数发生了改变,说明他填到了 \(j+1\) 处,枚举此时的前缀1的个数是 \(k\)。如果后面总共有 \(s\) 个属于 \(A\) 的点,那么方案乘上 \(\binom{s-j}{k-j-1}\times dp_{k-j-1}\times (k-j+1)\),\(dp_i\) 表示有 \(i\) 个连续的数的填的方案数,\(k-j+1\) 表示这个柱子的高度。

考虑求出 dp 值。\(dp_i=\sum\limits_{j=1}^idp_{j-1}\times dp_{i-j}\times\binom{i-1}{j-1}\times (j+1)\),分析同上。

#include<bits/stdc++.h>
using namespace std;
const int N=1205,P=1e9+7;
int dp[N],f[N],g[N],n,m,a[N],C[N][N],v[N];
int main()
{
	scanf("%d",&n),m=n<<1;
	for(int i=C[0][0]=1;i<N;i++)
	{
		C[i][0]=C[i][i]=1;
		for(int j=1;j<N;j++)
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%P;
	}
	for(int i=1;i<=n;i++)
		scanf("%d",a+i),v[m-a[i]+1]=1;
	dp[0]=1; 
	for(int i=1;i<=m;i++)
		for(int j=1;j<=i;j++)
			(dp[i]+=1LL*dp[j-1]*dp[i-j]%P*C[i-1][j-1]%P*(j+1)%P)%=P;
	f[0]=1;
	int c=0,s=0;
	for(int i=1;i<=m;i++)
	{
		if(!v[i])
		{
			for(int j=c;j<=n;j++)
				f[j]=1LL*f[j]*(j-c)%P;
			++c;
		}
		else
		{
			++s;
			for(int j=s;j>=c;j--)
				for(int k=j+1;k<=s;k++)
					(f[k]+=1LL*C[s-j-1][k-j-1]*dp[k-j-1]%P*(k-j+1)%P*f[j]%P)%=P;
		}
	}
	for(int i=1;i<=n;i++)
		f[n]=f[n]&1? f[n]+P>>1:f[n]>>1;
	printf("%d\n",f[n]);
}

标签:le,前缀,最古,石柱,样例,JOISC2020,times,遺跡,dp
From: https://www.cnblogs.com/mekoszc/p/17915155.html

相关文章

  • JOISC2020题解
    \(\text{ByDaiRuiChen007}\)ContestLinkA.Building4ProblemLink题目大意给\(2n\)个数对\((a_i,b_i)\),构造一个非降序列\(c_i\)满足\(\forall1\lei\len,c_i\in\{a_i,b_i\}\),且\(c_i=a_i\)的位置恰好有\(n\)个。数据范围:\(n\le5\times10^5\)。思路......
  • P6891 [JOISC2020] ビルの飾り付け 4
    P6891[JOISC2020]ビルの飾り付け4题目传送门Problem给定长度为\(2n\)(\(1\len\le5\times10^5\))的序列\(A\),\(B\)。要求构造一个单调不降的序列\(C\)。每个\(C_i\)从\(A_i\)和\(B_i\)中选取,且\(A\),\(B\)中都恰好选取\(n\)个。Solution最直接的想法显然是dp......
  • JOISC2020 Day2 T3 遗迹
    考虑给你\(h\),怎么整体得到最后的\(a\)这里感觉不能去想让一个位置\(x\)留下来的冲要条件,不然可能就做不出来了。自然的想法:从$2n$到\(1\)遍历每个\(h_i\),然后从\(h_i\)到\(1\)找第一个没有标记的值\(x\),此时\(i\)能留下来,如果找不到\(x\),那么\(i\)无法留下来......
  • P7213 [JOISC2020] 最古の遺跡 3 乱写
    不想写题解了,把写在草稿纸上的东西整理了一下感谢crashed大佬的题解与对本人问题的回答,没有他我就不会搞懂这道神仙计数题。......
  • 【JOISC2020】治疗计划
    【JOISC2020】治疗计划DescriptionJOI村庄有\(N\)个房屋,编号为\(1\)到\(N\),每个房屋住有一个村民,第\(i\)个房屋居住编号为村民\(i\)。现在,这\(N\)个房屋里的......
  • 「JOISC2020」扫除
    题目点这里看题目。分析观察一下部分分,前三个subtasks都比较简单。仔细思考一下,发现之后的难点都在于\(x,y\)两个坐标分离处理,这导致我们无法轻易地找出需要被修改......
  • 始祖比特币矿工现身!展示“最古老的签名”,日期可追溯到2009年!
    就好比创世之神一般,中本聪为我们带来了一个全新的金融世纪。作为比特币的重要先驱人物,中本聪究竟是谁已成为币圈至今难以揭开的世纪之谜。在线论坛是比特币起源故事不可或缺......
  • luogu P7219 [JOISC2020] 星座 3
    题面传送门实在没东西写了,随便拉一道题凑数。首先看这个东西就感觉只和两个点有关,事实上也是这样。关于最大值的问题肯定要把笛卡尔树建立出来,然后最大值变成两个点的LC......