Codeforces Round 872

“和出题人坐在一个教室打比赛是一种什么体验”

讲真,这场偏难

A. LuoTianyi and the Palindrome String

诈骗,只要不是全一个就是是 \(n-1\)

证明是 \(well-known\)

void solve(){
	string str;
	cin >> str;
	int n=str.length();
	str=" "+str;
	char c=str[1];
	fp(i,2,n) {
		if(str[i]!=c){
			cout << n-1 << endl;
			return; 
		}
	}
	cout << "-1" << endl;
}

B. LuoTianyi and the Table

挺明显的,分类讨论一下就好了

const int maxN=110;
int b[maxN*maxN],n,m;

void solve(){
	n=rd(),m=rd();
	fp(i,1,n*m) b[i]=rd();
	sort(b+1,b+n*m+1);
	int max1=b[n*m],max2=b[m*n-1];
	int min1=b[1],min2=b[2];
	int ans1,ans2;
	//max在左上角
	ans1=(max1-min1)*(max(n,m)-1)+(max1-min2)*(min(n,m)-1)+(max1-min1)*(n-1)*(m-1);
	ans2=(max1-min1)*(max(n,m)-1)+(max2-min1)*(min(n,m)-1)+(max1-min1)*(n-1)*(m-1);
	cout << max(ans1,ans2) << endl;
}

C. LuoTianyi and the Show

明显,我们有三种策略

  1. 直接全部放第一类观众
  2. 全部放第二类观众
  3. 放第三类观众,但是我们选择一个观众作为“基准”,在其左边放第一类观众,在右边放第二类观众

就是这样,一个前缀和之类的就搞定了

const int maxN=1e5+10;
int a[maxN],n,m;
int ts[maxN],pre[maxN],suf[maxN];

void solve(){
	n=rd(),m=rd();
	int left=0,right=0;
	fp(i,1,n){
		a[i]=rd();
		if(a[i]>0) ts[a[i]]=1;
		if(a[i]==-1) left++;
		if(a[i]==-2) right++;
	}
	fp(i,1,m)
		pre[i]=pre[i-1]+ts[i];
	fd(i,m,1) suf[i]=suf[i+1]+ts[i];
	int res=min(max(left,right)+pre[m],m);
	fp(i,1,m){
		if(!ts[i]) continue;
		int ans=min(m-i,suf[i+1]+right)+min(i-1,pre[i-1]+left)+1;
		res=max(ans,res);
	}cout << res << endl;
	memset(pre,0,sizeof(pre));
	memset(suf,0,sizeof(suf));
	memset(ts,0,sizeof(ts));
}

以上的题是本人场切的,下面都是抄题解

D. LuoTianyi and the Floating Islands

给定一棵 \(n\) 个结点的树,现在有 \(k(k\le n)\) 个结点上有人。
一个结点是好的当且仅当这个点到所有人的距离之和最小。
求在这 \(n\) 个点中随机取 \(k\) 个点时,好的结点的期望个数,对 \(10^9+7\) 取模。
\(n\in[3,2\cdot 1e5]\)

首先,有一个结论,就是这些好点,其一定在一条链上

然后你还发现,如果 k 是个奇数,那这个好点是一定的

这很明显

然后吧,可以想想,一条边,如果其左边分布着一半的点,右边分布着一半的点,那一定是一条“好边”

但是,有些时候好点会出现,但好边不会,怎么办呢

那根据期望的性质,我们有 \(E(x+1)=E(x)+1\)

充分证明了我的期望是白学了

(不对我好像学都没学过

那这里就好办了,给出柿子

\[\sum \tbinom{siz_i}{\frac{k}{2}} \tbinom{n-siz_i}{\frac{k}{2}} \]

最后加上个 1 ,就可以了

const int maxN=2*1e5+10;
int fac[maxN],ifac[maxN],siz[maxN];
ll sum=0;
vector<int>g[maxN];
ll n,k;

inline ll qmi(ll x,ll p){
	ll ans=1;
	for(;p;p>>=1){if(p&1)(ans*=x)%=mod;(x*=x)%=mod;}
	return ans;
}

void prepare(){
	fac[0]=1;
	fp(i,1,n)
		fac[i]=(fac[i-1]*i)%mod;
	ifac[n]=qmi(fac[n],mod-2);
	fd(i,n-1,0)
		ifac[i]=(ifac[i+1]*(i+1))%mod;
}

inline ll C(int n,int m){
	if(n<m||m<0||n<0) return 0;
	return (fac[n]*ifac[n-m])%mod*ifac[m]%mod;
}

void dfs(int now,int f){
	siz[now]=1;
	for(int x:g[now]){
		if(x==f) continue;
		dfs(x,now);
		siz[now]+=siz[x];
	}
	if(f!=0)
		(sum+=(C(n-siz[now],k/2)*C(siz[now],k/2))%mod)%=mod;
}

signed main(){
	n=lrd(),k=lrd();
	fp(i,1,n-1){
		int u=rd(),v=rd();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	if(k&1){
		cout << 1 << endl;
		return 0;
	}
	prepare();
	dfs(1,0);
	ll res=((sum*qmi(C(n,k),mod-2))%mod+1)%mod;
	cout << res << endl;
	
	return 0;
} 

最后,这场div1就只有一个人 fst ,足以见得数据的强度

当然edu就不一定了

posted @ 2023-05-16 13:56  颈流推进  阅读(29)  评论(0)    收藏  举报