首页 > 其他分享 >Codeforces 1874F - Jellyfish and OEIS

Codeforces 1874F - Jellyfish and OEIS

时间:2023-10-03 23:44:23浏览次数:33  
标签:1874F OEIS 方案 int 容斥 Codeforces 乘以 MAXN 区间

考虑对 \(\sum m_i-i+1\) 个不可行的集合进行容斥,即钦定一些区间集,要求它们对应的 \(p_l,p_{l+1},\cdots,p_r\) 必须是 \([l,r]\) 的排列,计算方案数乘以容斥系数之和。

如果容斥的集合中存在相交的区间,那么这个方案数其实不太好计算。不过根据区间的性质,对于 \(l_1<l_2\le r_1<r_2\),如果 \(p[l_1...r_1],[l_2...r_2]\) 都分别是 \([l_1,r_1],[l_2,r_2]\) 的排列,那么 \(p[l_1...l_2-1],p[r_1+1...r_2]\) 也分别是 \([l_1,l_2-1],[r_1+1,r_2]\) 的排列。这样感性理解,如果存在严格相交的区间,那么容斥系数可以抵消,具体证明可以构造个双射,这里略去。

这样我们只用考虑容斥的区间只有不交和包含的情况。这样区间构成了一个树形结构,并且方案数是好算的——就是每一层散点个数的阶乘之积。这就很方便我们区间 DP 了。设 \(f_{l,r}\) 表示只考虑包含于 \([l,r]\) 的区间,且 \([l,r]\) 被容斥的所有方案的容斥系数乘以方案数之和。\(g_{l,r,x}\) 表示只考虑包含于 \([l,r]\) 的区间,这一层有 \(x\) 个散点的所有方案的容斥系数乘以方案数之和。这样复杂度是 \(n^4\) 的,且常数很小,可以通过。

不过话说回来,为啥 \(n^4\) 出 \(200\)?很替 csy 抱不平。

const int MAXN=200;
const int MOD=1e9+7;
int n,lim[MAXN+5],fac[MAXN+5],f[MAXN+5][MAXN+5],g[MAXN+5][MAXN+5][MAXN+5];
int main(){
	scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&lim[i]);
	for(int i=(fac[0]=1);i<=n;i++)fac[i]=1ll*fac[i-1]*i%MOD;
	for(int i=1;i<=n+1;i++)g[i][i-1][0]=1;
	for(int len=1;len<=n;len++)for(int l=1,r=len;r<=n;l++,r++){
		for(int x=1;x<=r-l+1;x++)g[l][r][x]=g[l+1][r][x-1];
		for(int k=l;k<=min(r-1,lim[l]);k++)for(int x=0;x<=r-k;x++)
			g[l][r][x]=(g[l][r][x]+1ll*g[k+1][r][x]*(MOD-f[l][k]))%MOD;
		for(int x=0;x<=r-l+1;x++)f[l][r]=(f[l][r]+1ll*fac[x]*g[l][r][x])%MOD;
		if(r<=lim[l])g[l][r][0]=(g[l][r][0]-f[l][r]+MOD)%MOD;
	}printf("%d\n",(lim[1]==n)?0:f[1][n]);
	return 0;
}

标签:1874F,OEIS,方案,int,容斥,Codeforces,乘以,MAXN,区间
From: https://www.cnblogs.com/tzcwk/p/Codeforces-1874F.html

相关文章

  • Codeforces Round 898 (Div. 4) A~H
    CodeforcesRound898(Div.4)A~HA.ShortSort题意:输出不一样的字符的个数思路:模拟即可//AConemoretimes//nndbk#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintmod=1e9+7;constintN=2e5+10;intmain(){ios::s......
  • Codeforces Round 901 (Div. 2)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1875。爱丽数码我真的好喜欢你啊为了你我要定制你的帆布包口牙!!!!A显然只会在剩余时间为1时使用工具,模拟即可。///*By:Luckyblock*/#include<bits/stdc++.h>#defineLLlonglong//========......
  • 「题解」Codeforces Round 894 (Div. 3)
    A.GiftCarpetProblem题目Sol&Code签到题#include<bits/stdc++.h>#defineN21typedeflonglongll;intmin(inta,intb){returna<b?a:b;}intmax(inta,intb){returna>b?a:b;}intT,n,m,a[4];std::strings[N];i......
  • CodeForces-1276#B 题解
    正文这是样例1第1组数据的图。让我们观察一下,路径1->6、1->7、2->6、2->7是可行的,所以答案为4。上述路径中好像点4没有贡献?再看看样例1第2组数据的图。发现点1和点4相互之间存在其他路径,无需经过点\(a\)和点\(b\)。综上,我们可以知道:在\(a\)和\(b\)......
  • Codeforces Round 730 (Div. 2) B. Customising the Track
    有\(n\)条高速公路,第\(i\)条告诉公路上的车流为\(a_i\)。现在可以执行以下操作任意次:将第\(i\)条高速公路上的一辆车移到第\(j\)条高速公路。需要求最小的\(\sum_{i=1}^{n}\sum_{j=i+1}^{n}|a_i-a_j|\)。不难发现可以构造\(\foralli,j,a_i=a_j\)使任......
  • Educational Codeforces Round 112 (Rated for Div. 2) A. PizzaForces
    有三种披萨:\(6\)、\(8\)、\(10\)块披萨。制作时间分别需要:\(15\)、\(20\)、\(25\)分钟。现在有\(n\)个人,每人需要一块披萨。询问使所有人能获得披萨的最快时间。观察:发现三种披萨的性价比都一样。(否则按最优性价比贪心)需要让得到的披萨数量\(m\geqn\)。不妨让\(n\)对......
  • 题解 Codeforces Round 901 (Div. 1) / CF1874A~E
    题解CodeforcesRound901(Div.1)/CF1874A~E比赛情况:过了AB。赛后发现B是假复杂度。https://codeforc.es/contest/1874A.JellyfishandGameProblemAlice&Bob又在博弈,Alice手上有\(n\)个苹果,第\(i\)个苹果的价值是\(a_i\);Bob手上有\(m\)个苹果,第\(i\)......
  • Codeforces Round #885 (Div. 2)
    赛时A题意理解错误,导致A调试半小时没出样例,直接提前下班-->https://codeforces.com/contest/1848A.JellyfishandUndertale题意:初始时长为b的定时炸弹,没秒从n个工具中选一个加时长\(x_i\),每次加时不能超过a,并流失一秒。问:炸弹爆炸前的最长时间是多长?思路:贪心枚举每个工具,每次......
  • Codeforces 1765H 题解
    题目大意题目大意给定一个\(n\)个点和\(m\)条边的有向图,并给定\(p_1,p_2,\cdots,p_n\)表示第\(i\)个点的拓扑序必须小于等于\(p_i\),求出每个点的最小拓扑序。题解题解题目要求拓扑序尽量小,转换一下就是在反图上拓扑序尽量大。考虑拓扑排序,当一个点不得不入队......
  • Codeforces Round 901 (Div
    C.JellyfishandGreenApple题解显然\(n\%m=0\),答案一定为\(0\)如果\(n>m\),我们显然可以将\(n/m\)的苹果分给每个人,然后再处理$n%m$如果\(n<m\),我们一定会将所有苹果一直对半切直到\(n>m\),所以答案每次对半切一定会加\(n\)直到\(n\%m=0\)的时......