首页 > 其他分享 >CF 1842 H

CF 1842 H

时间:2024-03-12 22:01:47浏览次数:28  
标签:min 1842 ll CF ge msk res mod

给自己的博客引流:3.15 解除密码 这个是这篇中最认真写的题。

妙妙题!!!太牛了。

首先,\(x_i\in [0,1]\),可以有两种:\(x_i<0.5,x_i\ge 0.5\)。因为在 \([0,1]\) 中抽出 \(0.5\) 的几率为 \(0\),就可以分成 \(x_i<0.5,x_i> 0.5\)。如果这样分,那么 \(x_i,x_j<0.5\implies x_i+x_j\le 1\),\(x_i,x_j>0.5\implies x_i+x_j\ge 1\)。因此我们只需要考虑 \(x_i<0.5,x_j>0.5\) 或者反过来的情况。为了方便起见,设 \(<0.5\) 为白色的,\(>0.5\) 为黑色的,默认 \(x_i\) 白色,\(x_j\) 黑色。

考虑一个白点和一个黑点怎么加起来 \(\le 1\)。几个解释是,黑色的到 \(1\) 的距离比白色的值大,即 \(1-x_j>x_i\)。如果加起来 \(\ge 1\),则 \(1-x_j<x_i\)。(如果 \(x_i>x_j\),则反过来)所以,我们可以求出 \(\min(x_i,1-x_i)\) 和 \(\min(x_j,1-x_j)\) 的大小关系。我们可以小的向大的连边,形成一个图。

如果我们不考虑时间复杂度,那么我们想求出的是:

  • 把 \(n\) 个点黑白染色。

  • 这种染色方案对应的图要是无环的,即有拓扑序。拓扑序是按照 \(\min(x_i,1-x_i)\) 的从小到大排序。

这个比较难求,我们可以反之求一个拓扑序,它对应的可行的黑白染色个数,设为 \(cnt\)。答案就是 \(\frac{cnt}{2^n\times n!}\)。

设 \(dp_{msk}\) 为已经固定好了 \(msk\) 里面包含的数(作为 \(\min(x_i,1-x_i)\) 最小的 \(\texttt{popcnt}(msk)\) 个)的黑白染色方案数。怎么转移呢?我们还可以发现两个性质:

  • 如果 \(x_a+x_b\le 1\),则 \(\min(x_a,x_b)<0.5\)。也就是说,固定 \(\max(x_a,x_b)\) 对应的时候,\(\min\) 的已经在他前面了。

  • 如果 \(x_a+x_b\ge 1\),则 \(\max(x_a,x_b)>0.5\)。也就是说,固定 \(\min(x_a,x_b)\) 对应的时候,\(\max\) 的已经在他前面了。这是因为,\(\max\) 的 \(\min(x_i,1-x_i)\) 这个值更小。

那么,就很好转移了。具体来说,对于所有 \(j\notin msk\),

  • 如果所有关于 \(j\) 的 \(\le 1\) 的限制的另一端都确定了,\(j\) 就可以是黑色。

  • 如果所有关于 \(j\) 的 \(\ge 1\) 的限制的另一端都确定了,\(j\) 就可以是白色。

时间复杂度 \(\mathcal{O}(2^nn)\)。

Code
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const ll mod = 998244353;

ll pw(ll x,ll y=mod-2){
	ll res=1;
	while (y){
		if (y&1){
			res=res*x%mod;
		}
		x=x*x%mod;
		y>>=1;
	}
	return res;
}

ll msk[2][20],dp[1<<20];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	int n,m;
	cin>>n>>m;
	ll fac=1;
	for (ll i=1; i<=n; i++){
		fac=fac*i%mod;
	}
	ll div=pw(2,n)*fac%mod;
	for (int i=1; i<=m; i++){
		ll t,a,b;
		cin>>t>>a>>b;
		a--;
		b--;
		msk[t][a]|=1<<b;
		msk[t][b]|=1<<a;
	}
	dp[0]=1;
	for (int i=0; i<(1<<n); i++){
		for (int j=0; j<n; j++){
			if (!(i>>j&1)){
				if ((msk[0][j]|i)==i){
					(dp[i^(1<<j)]+=dp[i])%=mod;
				}
				if ((msk[1][j]|i)==i){
					(dp[i^(1<<j)]+=dp[i])%=mod;
				}
			}
		}
	}
	cout<<dp[(1<<n)-1]*pw(div)%mod<<"\n";
	return 0;
}

标签:min,1842,ll,CF,ge,msk,res,mod
From: https://www.cnblogs.com/SFlyer/p/18069427

相关文章

  • CF1929E. Sasha and the Happy Tree Cutting
    Problem-1929E-Codeforces无意看一眼标签是\(dp\)就一直朝树形状压\(dp\)的方向想了一年,发现不是树形\(dp\)设\(dp_S\)为完成集合\(S\)内的限制所需要的最少边数把每一对顶点的路径上每条边的值都状压,表示添加这条边可以实现的限制有哪些,记为\(b_i\)因......
  • 从CF1702E看二分图判断的两种方法
    https://www.luogu.com.cn/problem/CF1702E转化题意把所有数连边,判断是否为二分图。染色法voidsolve(){#definetestsintn;std::cin>>n;std::map<int,std::vector<int>>edge;std::vector<bool>used(n+1);boolok(true);......
  • 「CF78C」 Beaver Game
    题意一场博弈游戏,有\(n\)个长度为\(m\)木棍。两人轮流进行操作,每次操作可选择一根木棒把它进行任意等分,使得分完后每段长度都小于\(k\)。最终无法操作的人判负。两人都执行最优操作,先手名为Timur,后手名为Marsel,输出最终赢家。分析可以分为两种情况:\(n\)为偶数,此时无......
  • 从CF1730B看题意转化与二分三分
    Problem-1730B-Codeforces贪心解法\(∣a−b∣=\max(a−b,b−a)\)由绝对值的性质易证。那么直接把\(t_i\)算到距离中,转换成求最左和最右“坐标”的中间点的简单问题。//通过把t[i]算到距离中,转换成求最左和最右坐标的中间点的简单情况voidsolve(){#definete......
  • 不能访问网络位置 0x800704cf
    删除一些网络配置后发现一些共享的网络磁盘无法访问了使用netuse查看提示错误。 更改注册表:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\OrderProviderOrder的键值为:LanmanWorkstation 之后查看本地网络连接的属性。发现少了Microsoft网络客......
  • 【题目】ccf csp 202309-3 梯队求解
    题目大意:给出需要求解的逆波兰表达式(后缀表达式),包含多个变量,现在每一次查询,给出所有变量的值,询问对于给定的变量其函数偏导值为多少。(仅包含乘、加减运算)(例如,对于表达式:x1x1x1*x2+*可转化为(x1*x1+x2)*x1对x1求偏导后变为(2*x1+x2)+(x1*x1+x2)带入x1=......
  • CF1599
    CF1599BubbleCup14-FinalsOnlineMirror(Unrated,ICPCRules,TeamsPreferred,Div.1)CF1599Alink题意给你一个长度为\(N\)的质量为\(A_1,A_2,\dots,A_N\)的数组\(A\)。每个数组中的值表示各个砝码的重量。所有砝码的质量均不相同。你可以把每个砝码放在天平......
  • CF763E Timofey and our friends animals
    使用回滚莫队可以有效降低思维含量。对于回滚莫队和可撤销并查集,本文不再赘述。假设当前询问是\([L,R]\),目前加入了\([l,r]\)的所有点和边。将\(r\)增加\(1\)时,连边\((r+1,v\in[l,r])\)。然后需要处理左边的散块。对于所有零散的\(l\),连边\((l,v\in[L,R])\)。上述两......
  • 从CF1935B学习维护前后缀区间mex
    Problem-B-Codeforces维护前缀区间mex和后缀区间mex,枚举二者相同的断点原理随区间增长,\(\texttt{mex}\)只可能增,不可能减,所以可以用一个变量维护目前的\(mex\),区间扩大后可以直接沿用较小区间的\(mex\),再处理增加即可。维护\(\texttt{mex}\)std::set<int>S;//当前......
  • CF1583E Moment of Bloom 题解
    题意:给定一张\(n\)个点\(m\)条边无向连通图,以及\(q\)个点对\((a,b)\),出事每条边权值为\(0\)。对于每个点对我们需要找一条从一个点到另一个点的简单路径,将所有边的权值加一。要求构造一种方案使得每条边权值都是偶数。如果不行,输出最少还要几个点对才能满足要求。\(n,m......