首页 > 其他分享 >CF1874F 做题记录

CF1874F 做题记录

时间:2024-03-29 11:56:45浏览次数:18  
标签:CF1874F 记录 sum 容斥 maxn 区间 ll define

link

太绝了。

首先容易想到要用容斥,具体的,我们钦定区间集合 \(S=\{[l,r]|p_{l...r}\text{是} l...r \text{的排列}\}\),贡献为 \((-1)^{|S|}\) 乘上对应方案数。

然后仔细观察,不难发现对于选出来的区间 \([l_1,r_1],[l_2,r_2]\),若满足 \(l_1<l_2<r_1<r_2\),则 \([l_1,l_2-1],[l_2,r_1],[r_1+1,r_2]\) 也满足对应条件。

考虑 trick,我们能否利用容斥系数抵消掉一些贡献。对于上述的两个区间,有 \(m_{l_1}\ge r_1\)。而 \(l_2<r_1\le m_{l_1}\),我们显然可以多选择出一个合法的区间 \([l_1,l_2-1]\)。这样方案数不变,容斥系数会取反。

进一步的,我们可以构造双射:找出 \(S\) 中最靠前的两对相交区间 \([l_1,r_1],[l_2,r_2]\),然后若存在 \([l_1,l_2-1]\) 则删除,否则加入 \([l_1,l_2-1]\),这样就把所有 \(S\) 两两匹配起来,系数抵消。

所以,我们只需要考虑不存在严格相交的区间即可,此时每对区间的关系要么相交,要么相离。建成树状,我们考虑对于每个区间,枚举它包含的最外层的区间进行 dp。

设 \(f[l,r]\) 表示仅填写 \(p_{l...r}\),且 \(S\) 中的区间都是 \([l,r]\) 的子区间,此时的答案(方案数乘容斥系数之和)。特别的,\([l,r]\notin S\)。

枚举 \(l\),设 \(g[r,x]\) 表示 \(l...r\) 中有 \(x\) 个位置没有被 \(S\) 中的区间包含,在此前提下的答案,利用 \(g\) 辅助转移。有:

\[g[r,x]=g[r-1,x-1]-\sum_{i=l+1}^r g[i-1,x]f[i,r] \]

\[f[l,r]=\sum_{x=0}^{r-l+1} x!\cdot g[r,x] \]

求出每个 \(f[l,r]\) 后,更新 \(g[r,0]\gets g[r,0]-f[l,r]\)。

然后这题就做完了,时间复杂度 \(O(n^4)\)。

当然还能这样 dp:

我们发现如果两个区间 \([l_1,r_1],[l_2,r_2]\) 满足 \(l_1<l_2<r_1=r_2\),其实这种方案仍然可以双射抵消,但是并非严格相交。

考虑设 \(f[l,r,0/1]\) 表示钦定的 \(S\) 不包含/包含右端点 \(=r\) 的,其中 \(f[l,r,1]\) 中 \(S\) 可以选 \([l,r]\),此时的答案。

那么 \(f[l,r,1]=\sum\limits_{x=0}^{r-l+1} x!g[r,x],\space f[l,r+1,0]=\sum\limits_{x=0}^{r-l+1} (x+1)! g[r,x]\)。

\(g[r,x]=g[r-1,x-1]+\sum\limits_{i=l}^r g[i-1,x]f[i,r,0]\)

最终答案是 \(f[1,n,1]\)。

总结思路:

  • 容斥,但是要先确定容斥什么,这个很重要

  • 观察性质,有什么可以把复杂的东西简化

  • 容斥系数可以构造双射来抵消,一个小 trick

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define pir pair<ll,ll>
#define fi first
#define se second
#define mkp make_pair
#define pb push_back
using namespace std;
const ll maxn=210, mod=1e9+7;
ll n,a[maxn],f[maxn][maxn],g[maxn][maxn],fac[maxn];
int main(){
	scanf("%lld",&n);
	for(ll i=1;i<=n;i++) scanf("%lld",a+i);
	if(a[1]==n){
		puts("0"); return 0;
	}
	fac[0]=1;
	for(ll i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	for(ll i=n;i;i--){
		memset(g,0,sizeof g);
		g[i-1][0]=1;
		for(ll j=i;j<=n;j++){
			for(ll c=0;c<=j-i+1;c++){
				if(c) g[j][c]=g[j-1][c-1];
				for(ll k=i+1;k<=j;k++)
					if(a[k]>=j) g[j][c]=(g[j][c]-g[k-1][c]*f[k][j])%mod;
				f[i][j]=(f[i][j]+g[j][c]*fac[c])%mod;
			}
			if(j<=a[i]) g[j][0]=(g[j][0]-f[i][j])%mod;
		}
	}
	printf("%lld",(f[1][n]+mod)%mod);
	return 0;
}

标签:CF1874F,记录,sum,容斥,maxn,区间,ll,define
From: https://www.cnblogs.com/Sktn0089/p/18103512

相关文章

  • H5项目设置接口报错预警警报,需记录什么信息能有效排查报错问题
    在H5项目中,如果要有效地排查接口报错问题,记录以下信息可能会有所帮助:错误信息:记录报错信息的具体内容,包括错误代码、错误描述等。这将是你开始排查问题的关键信息。接口地址:记录发生错误的接口地址,包括请求的URL、接口路径等。这有助于定位问题所在的具体接口。请求......
  • 跨时钟域学习记录(二)——XPM_CDC
      本文以Xilinx提供的xpm_cdc代码为例,整理处理跨时钟域数据传输的常见方法。宏定义  Xilinx定义了多个宏定义代替描述触发器行为的always块,列举如下宏名称含义XPM_XSRREG带同步复位/置位的同步寄存器XPM_XSRREGEN带同步复位/置位和使能的寄存器XPM_XARREG带异步复位/......
  • FLASK学习记录-宏、模板继承
    宏{%macroname%}{%endmacro%}app.pyfromflaskimportFlask,render_templateapp=Flask(__name__)@app.route('/')defindex1():returnrender_template("macro1.html")@app.route("/")defindex2():returnrend......
  • NVIDIA H200 创下 MLPerf LLM 最新推理记录
    NVIDIAH200TensorCoreGPU和NVIDIATensorRT-LLM创下MLPerfLLM最新推理记录生成式人工智能正在解锁新的计算应用程序,通过持续的模型创新来极大地增强人类的能力。生成式AI模型(包括大型语言模型(LLM))用于制作营销文案、编写计算机代码、渲染详细图像、创作音......
  • FLASK学习记录-Jinja2模块引擎
    Flask中引入了jinja2模板引擎,可以显示动态数据、数据过滤、语句控制、模板继承和引用等。实战实例app.pyfromflaskimportFlask,render_templateapp=Flask(__name__)@app.route('/')defindex():LibraryName="NationalLibrary"visitor={"name":"J......
  • Gitlab 实现仓库完全迁移,包括所有提交记录、分支、标签
    1方案一:命令cd<项目目录>gitfetch--allgitfetch--tagsgitremoterenameoriginold-origin#可以不保留gitremoteaddoriginhttp://***(项目的新仓库地址)#gitremoteset-urlorigin<项目的新仓库地址>gitpushorigin--allgitpush--tags有多个分支的话......
  • ARC112F 做题记录
    link主要记录一下这种题的做题过程。第一步我们发现第\(j\)种牌每满\(2j\)张就会向下一位进一,考虑套路:我们用第\(1\)种牌来表示第\(j\)种牌,权值为\(W_{j-1}=\prod\limits_{i=1}^{j-1}2i\)。这样我们可以只用第\(1\)种牌的数量,即一个数来代替一组牌,不妨设初始数......
  • FLASK学习记录-PIPENV虚拟环境搭建
     $pipinstallflask-ihttps://pypi.tuna.tsinghua.edu.cn/simpleLookinginindexes:https://pypi.tuna.tsinghua.edu.cn/simpleCollectingflaskDownloadinghttps://pypi.tuna.tsinghua.edu.cn/packages/93/a6/aa98bfe0eb9b8b15d36cdfd03c8ca86a03968a87f27ce22......
  • CF1936E 做题记录
    link设\(P_i=\max(p_1,p_2,...,p_i)\)。首先转容斥,方便计算。接下来容斥的点很巧妙:钦定哪些前缀最大值重合(非位置),我们可以把这个前缀最大值放在第一次重合的位置计算。设\(f[i]\)表示考虑了前\(i\)个位置,并且\(i\)是钦定的前缀最大值的第一个重合位置,带符号的方案数之......
  • 2024.3.27复试记录
    1.algorithm实现a+b字符串的加法注意事项对进位的控制intcarry=0i=a.size()-1;j=b.size()-1;while(i>=0;j>=0){stringres="";num=carry+a[i]-'0'+b[i]-'0';//-'0'是为了变为charres+=num%10+'0';carry=num/10;//若大于10,则carry=1......