9.24 模拟赛

发布时间 2023-09-24 20:52:51作者: Atom-

时间安排

8:00~8:40

看题,除a没有会的

8:40~9:20

写完a

9:20~12:00

一直看b,想差分约束,然后坐牢

总结

  1. 智力感觉有所下降
  2. 认真看题面

题解

A

n遍dijkstra,然后建图,再跑dijkstra

B

#include <bits/stdc++.h>
#define mod 998244353
#define ll long long
using namespace std;
ll C[3005][3005],fact[3005];
void init()
{
	C[0][0]=1;
	for (int i=1;i<=3003;i++)
		for (int j=0;j<=i;j++)
		{
			if (i==1 || j==0) C[i][j]=1;
			else C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
		}
	fact[0]=1;
	for (int i=1;i<=3003;i++) fact[i]=fact[i-1]*i%mod;
	return;
}
void add(ll &x,ll y) {x+=y; x%=mod; return;}
ll dp[3005][3005];
int suml[3005],sumr[3005];
int m,n,l,r;
int main()
{
	init();
	cin>>m>>n;
	for (int i=1;i<=m;i++) {cin>>l>>r; suml[l]++; sumr[r]++;}
	for (int i=1;i<=n;i++) suml[i]=suml[i-1]+suml[i],sumr[i]=sumr[i-1]+sumr[i]; // 左区间 <=i 的人数(不一定覆盖到i), 右区间 <=i 的人数 
	dp[0][0]=1;
	for (int i=0;i<n;i++) // n 个 拍卖品 
		for (int j=0;j<=m;j++) // m 个人 
			if (dp[i][j]) //前i列,有j个R未满足 
			{
				l=suml[i+1]-suml[i]; //第 i+1 列有多少个左区间的端点,一定需要在这里被满足的左区间 
				r=sumr[i]-j; //之前满足了这么多个右区间 
				int rr=sumr[i+1]-sumr[i]; //这第i+1列一共有这么多个右区间的左端点 
				int lef=i+1-r-suml[i]; //现在前面还剩下lef个列可以选
				
				
				if (lef<0) continue; //如果lef<0没可能
				//case1:这列选给了一个R
				if (j+rr>=1 && lef>=1) add(dp[i+1][j+rr-1],dp[i][j]*(j+rr)%mod*C[lef-1][l]%mod*fact[l]%mod); 
				//case2:这列没选给一个R
				if (lef>=l) add(dp[i+1][j+rr],dp[i][j]*C[lef][l]%mod*fact[l]%mod); 
			}
	cout<<dp[n][0]<<endl;
} 

C

打表发现 \(0\sim2^k-1\) 中二进制表示下有奇数个 \(1\) 的数(下面统称为 \(odd_k\))和有偶数个 \(1\) 的数(下面统称为 \(eve_k\))个数相同,严格证明考虑数学归纳法:

\[特殊的,当k=0时,odd_0\not=eve_0 当k=1时,显然有odd_1=eve_1 \\ 当k=2时,odd_2=odd_1+eve_1,eve_2=eve_1+odd_1,考虑2^1\sim2^2-1相当于在0\sim2^1-1中每个数前加一个1 \\ 当k=3时,odd_3=odd_2+eve_2,eve_3=eve_2+odd_2 \\ \cdots 当k=n时,odd_n=odd_{n-1}+eve_{n-1},eve_n=eve_{n-1}+odd_{n-1} \]

证毕
更进一步的
可以得到任意 \(2^{c_1}+2^{c_2}+...+2^{c_n}\ (c_i\not=0)\)\(eve\)\(odd\) 相等,所以只需要特判是否含有 \(2^0\)

剩下的只需要用做区间恢复,然后统计 \(odd\)\(eve\) 然后成起来就是答案,用线段树维护即可

D

首先,每个人都是独立的,也就是说,可以分开求每个人的期望

每个点被选的概率相等,当选了 \(x\) 个点时,概率就等于 \(\binom{n}{x}\),再考虑求一个点对被选中的概率

对于一个固定的点对 \((a,b)\),其出现次数就相当于同时选了这个点对对应的 \(a\)\(b\),剩下的点随便选,也就是 \(\binom{n-2}{x-2}\)

那么对于这个点对,被选中的概率就是 $$\frac{\binom{n-2}{x-2}}{\binom{n}{x}}$$

最后答案就是 总的满足条件的点对数量\(\times\)固定点对被选中的概率 得到的就是选中点对的期望

现在已经求出 固定点对被选中的概率,对于 总的满足条件的点对数量 可以直接点分治 \(O(nlogn)\)求得