首页 > 其他分享 >[AGC036F] Square Constraints

[AGC036F] Square Constraints

时间:2024-02-26 19:23:23浏览次数:18  
标签:Square ve int 容斥 AGC036F -- ans 510 Constraints

[AGC036F] Square Constraints

更好的阅读体验

image.png

可以看成是求值域两个半圆间的排列的个数。

首先对于每个 \(i\) 设 \(L_i,R_i\) 表示 \(p_i\) 取值的下界和上界。

如果没有小圆的限制即没有下界,问题很简单:把 \(R\) 从小到大排序,然后 \(\prod_{i=1}^nR_i-i+1\) 即为答案,原因显然,因为前面已经选了 \(i-1\) 个并且前 \(i-1\) 个值域 \(\leq R_i\)。

现在加入了 \(L\) 的限制,考虑容斥,用 \(\leq R_i\) 的答案减去 \(\leq L_i-1\) 的答案即为原问题的答案。容斥系数为钦定为 \(L_i-1\) 的位置的个数,其余正常算。

但是因为上面的公式只有在上界有序的情况下(即知道每个限制最终的排名)才能使用,实际上选的是:

  1. \([0,n]\) 中选了一些 \(L-1\)。

  2. \([0,n]\) 中剩下的部分的选了 \(R\)。

  3. \([n+1,2n-1]\) 中因为没有下界限制无法进行容斥,所以都选的是 \(R\)。

这样三个部分内部都是有序的,而且第 \(2\) 部分一定是最大的。所以我们需要把 \(1,3\) 进行一个类似归并的过程来计算方案数。

把 \([n+1,2n-1]\) 的 \(R_i\) 挂在 \([0,n]\) 最后一个满足 \(L_j-1\geq R_i\) 的 \(j\) 上,设 \(f_{i,j}\) 为考虑了 \([i,n]\) 中所有数,钦定了 \(j\) 个做容斥,带容斥系数的方案数。\(f_{i,j}\) 应当计算的部分是上一步挂在 \([i,n]\) 上的所有 \(R\) 的贡献,\([i,n]\) 内容斥的 \(L\) 的贡献和 \([i,n]\) 内没有容斥的 \(R\) 的贡献。

但是直接做有一个问题:计算方案数使用开头的那个 \(\prod R_i-i+1\) 的公式算的,但是在 \([i,n]\) 内没有容斥的 \(R\) 计算途中并不知道他的排名。

如果已知最后要容斥几个,那 \([i,n]\) 内没有容斥的 \(R\) 的排名在 dp 过程中就已知了。可以最外层枚举目的要容斥 \(k\) 个,这样内层进行 dp,\(f_{i,j}\) 意义和上面一样,但是这里可以不带容斥系数,因为我们最后只会用到 \(f_{1,k}\)。

外层枚举复杂度 \(\mathcal O(n)\),内层 dp \(\mathcal O(n^2)\),总复杂度 \(\mathcal O(n^3)\)。

	int n,M,ans,lim,L[510],R[510],a[510],f[510][510];
	vector<int> ve[510];
	inline void mian()
	{
		read(n,M);
		for(int i=0;i<2*n;++i)
		{
			R[i+1]=sqrt(4*n*n-i*i)+1;
			if(i<n)L[i+1]=ceil(sqrt(n*n-i*i))+1;
			else L[i+1]=1;
		}
		R[1]--;
		for(int i=2*n;i>=n+2;--i)
		{
			if(R[i]>=L[1]){!lim?lim=i:0;ve[0].eb(R[i]);continue;}
			for(int j=n+1;j>=1;--j)
			if(L[j]-1>=R[i]){ve[j].eb(R[i]);break;}
		}
		for(int i=n+1;i>=1;--i)a[i]=a[i+1]+ve[i].size();
		for(int i=0;i<=n;++i)
		{
			memset(f,0,sizeof(f)),f[n+1][0]=1;
			for(int l=0;l<(int)ve[0].size();++l)
			f[n+1][0]=1ll*f[n+1][0]*(ve[0][l]-l-i-a[1])%M;
			for(int j=n+1;j>=1;--j)
			{
				for(int k=0;k<=i;++k)
				{
					for(int l=0;l<(int)ve[j].size();++l)
					f[j][k]=1ll*f[j][k]*(ve[j][l]-a[j+1]-k-l)%M;
					if(k<i&&L[j]-1-k>0)
					f[j-1][k+1]=(f[j-1][k+1]+1ll*f[j][k]*(L[j]-1-k-a[j])%M+M)%M;
					f[j-1][k]=(f[j-1][k]+1ll*f[j][k]*(R[j]-(2*n-(j-(i-k)))))%M;
				}
			}
			if(i&1)ans=(ans-f[0][i]+M)%M;
			else ans=(ans+f[0][i])%M;
		}
		write(ans);
	}

标签:Square,ve,int,容斥,AGC036F,--,ans,510,Constraints
From: https://www.cnblogs.com/WrongAnswer90-home/p/18034997

相关文章

  • [ARC157C] YY Square
    首先考虑权值不算平方这么算,这个很简单,直接dp,设\(f_{i,j}\)是为到点\((i,j)\)结束的路径权值和,那么转移就很简单了加上左边的上边的在加上两个Y所加上的新权。那么平方怎么做,注意到\((a+1)^2=a^2+2a+1\),直接类似的转移,在加上两倍一次权值即可。constintN=2e3+5;......
  • 将SquareLine Studio导出的LVGL代码在windows上运行
    1.引入SDL驱动SquareLineStudio导出的LVGL代码后如果要在windows上运行需要引入SDL的驱动,官方导出的代码是没有的,这里提供一个自己在网上找到的SDL2-2.28.1包,解压后放在同一目录下即可2.编写CmakeLists.txt这里提供我这边自己修改的CmakeLists.txtcmake_minimum_required(......
  • CF1697F Too Many Constraints
    题意简述有一个长度为\(n\)的整数序列\(a\),值域为\([1,k]\),有\(m\)条限制:1ix,表示\(a_i\not=x\)2ijx,表示\(a_i+a_j\lex\)3ijx,表示\(a_i+a_j\gex\)试构造一个可能的\(a\),或报告无解。\(n,m\le2\times10^4,k\le10\)。分析看上去像是一个差分约束题,......
  • CF1401E Divide Square 题解
    解题思路其实多看几组也能发现块数等于交点的数量加上两个端点都在边上的线段数量再加一。证明如下(图见样例):对于两条只有一个端点位于边上的线段,因为保证有一个端点位于边上,那么这两条线段的交点一定会和已存在的点、边构成一个新的矩形;对于其中有一条为两个端点均位于边上的......
  • [ARC135D] Add to Square 题解
    题目链接点击打开链接题目解法很牛的题!!!先考虑一步很牛的转化:把矩阵黑白染色,且\(i+j\)为奇数的位置的值取反,每次操作变为左上右下\(+v\),左下右上\(-v\)这样有啥好处?操作不会使行和列的和改变考虑答案的下界显然是:\(\max\{\)行的绝对值之和,列的绝对值之和\(\}\)这里给出......
  • [Typescript 5] infer Constraints
    Sincetypescript5,weareabletoaddconstraintsoverinfer.Followingcodedoesn'tapplyconstraints,sotheinferredelementcouldbe stringand numbertypeGetFirstStringIshElement<T>=Textendsreadonly[inferS,..._:any[]]?S:n......
  • abc152F - Tree and Constraints
    abc152F-TreeandConstraints题意:给定一棵树,要求对每条边染成黑色或者白色,其中有m个限制,第i个限制形如ai,bi,表示ai到bi的路径上至少有一条黑色边,求方案数。看到数据第一反应是状压,但是好像没办法搞。于是考虑容斥,能想到容斥的话就差不多做完了,每次标记一下两个点和他们的lc......
  • 利用topologySpreadConstraints使多个Pod在节点之间均衡调度
    在ingress-nginx部署时有个需求,就是3个节点单个节点需要至少跑3个实例。这需求有点像异地多活时,每个区域至少要跑2实例一样,不同之处是一个是节点级别,一个是区域级别。deployment在副本数多的时候虽然可以让调度器大致上的平均调度,但是当遇到个别节点压力大的时候会降低调度score......
  • 利用topologySpreadConstraints使多个Pod在节点之间均衡调度
    在ingress-nginx部署时有个需求,就是3个节点单个节点需要至少跑3个实例。这需求有点像异地多活时,每个区域至少要跑2实例一样,不同之处是一个是节点级别,一个是区域级别。deployment在副本数多的时候虽然可以让调度器大致上的平均调度,但是当遇到个别节点压力大的时候会降低调度score......
  • Square-free division (easy version) 题解
    题意:给定一个长度为\(n\)的序列,求最少能将这个序列分成多少段使得任意一段中不存在两个数的积为完全平方数。一个小Trick:如果两个数乘起来为平方数,可以先将每个数的平方因子除掉,然后这两个数必然相等。于是这道题被转化为了一个区间不能有相等的值,这就很典了。设\(pos_{a_{i......