Codeforces Round 734 (Div. 3) 题解

建议开题顺序:A,B1,B2,C,E,F,D1,D2。

A. Polycarp and Coins

k=min(c1,c2),则 (c1k)×1+(c2k)×2+k×3=n。注意到 nmod30,1,2。所以我们 |c1c2| 最多为 1,只需要将 nmod312 即可。

B1. Wonderful Coloring - 1

cnti 表示 sj=i 的数量。那么当 cnti2 时,我们能在里面随便拿两个,一个染成红色,一个染成绿色。当 cnti=1 时,记一共有 x 个。那么我们将其中 x2 个染成红色,另外 x2 个染成绿色。很显然剩下的点只能不染色。模拟即可。

B2. Wonderful Coloring - 2

模仿 B1 的思路。当 cntik 时,选其中 k 个染成 k 种颜色。当 1cnti<k 时我们将总数记录出来,然后均匀地染色即可。时间复杂度 O(n)

代码

 
il void solve(){
	n=rd,k=rd;
	for(re int i=0;i<=n;++i) cnt[i]=0,v[i].clear();
	for(re int i=1;i<=n;++i) ans[i]=0,s[i]=rd,++cnt[s[i]],v[s[i]].push_back(i);
	int c1=0,c2=0;
	for(re int i=1;i<=n;++i)
	if(cnt[i]>=1&&cnt[i]<k){
		c1+=cnt[i];
	}
	for(re int i=n;i>=1;--i)
	if(cnt[i]>=1&&cnt[i]<k){
		if(c1%k!=0) c1-=min(cnt[i],(c1%k));
	}
	int U=1,c_=0;
	for(re int i=1;i<=n;++i)
	if(cnt[i]>=k){
		int cc=0;
		for(auto x:v[i]){
			ans[x]=++cc;
			if(cc==k) break;
		}
	}
	else{
		for(auto x:v[i]){
			if(c_>=c1) break;
			++c_,U++,U%=k;
			if(!U) U=k;
			ans[x]=U;
		}	
	}
	for(re int i=1;i<=n;++i) cout<<ans[i]<<" ";
	cout<<"\n";
   	return ;
}

C. Interesting Story

fi,j 为第 i 个字符串中 sk=j 的数量与 skj 的差。那么对于一个字符 x,记我们选择的字符串下标为 p1pm,则:i=1mfpi,x>0。暴力枚举最多的字符是哪个,则每次贪心地选 fi,j 大的,只要和不小于 1 即可。

D1. Domino (easy version)

暴力分类讨论题。这里我们令 m 为偶数。如果读入的 m 为奇数,旋转矩阵即可。如果 k=0,当 n 为偶数时有解(全构造竖的),否则无解。如果 k0,我们考虑将前面的若干行填满(因为 m 为偶数,所以只要数量足够多就可以),记填满了 x 行,最后剩下 y 个。当 nx 为偶数时,如果 y 也为偶数,则我们可以构造将 y2 个放在第 x+1 行的前面,其它的放第 x+2 行的前面,就能保证每一列后面还没填的空为偶数个(每两个放一个竖的就行了);否则无解。当 nx 为奇数时,此时我们将第 x 行的一半放下来,到第 x+1 行就能保住合法了;否则无解。这里需要注意我们 x1

然后就判断完了。

D2. Domino (hard version)

将 D1 的所有合法情况分别构造即可,但是有点麻烦。

E. Fixed Points

考虑 DP。定义状态函数 fi,j 表示前 i 个数,删了 j 个位置时的最大匹配价值。然后 O(n2) 就做完了。

F. Equidistant Vertices

注意到当 k>2 时我们选出来的点满足:任意两个点的 LCA 相同,且距离 LCA 的距离相等。然后暴力做背包就行了,时间复杂度 O(n4)

posted @   harmis_yz  阅读(13)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示