洛谷2021年05月月赛参加总结


一、前言

洛谷每个月都会举办月赛,这次我参加的是 $Div.2$(实力不允许)。

以下只讲我会做的题目。

二、A:「MCOI-05」饱食

传送门:https://www.luogu.com.cn/problem/P7566?contestId=30514

对于这道题,我估计大家一定会先想到 $DFS$ 死算。其实这完全没有必要,可以统计每只兔子的名字的首字母的出现次数,然后关注“M”“C”“O”“I”四个字母的出现次数。

$AC$ 代码:

#include<cstdio>
#include<cstring>
using namespace std;
int n;
long long rabbit_capital[26];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		char temp[12];
		scanf("%s",&temp);
		rabbit_capital[temp[0]-'A']++;
	}
	printf("%lld\n",rabbit_capital['M'-'A']*rabbit_capital['C'-'A']*rabbit_capital['O'-'A']+rabbit_capital['I'-'A']*rabbit_capital['C'-'A']*rabbit_capital['O'-'A']+rabbit_capital['M'-'A']*rabbit_capital['C'-'A']*rabbit_capital['I'-'A']+rabbit_capital['M'-'A']*rabbit_capital['I'-'A']*rabbit_capital['O'-'A']);
	return 0;
}

记录:https://www.luogu.com.cn/record/50155330

注意开 long long!正如一句话所言,十年 OI 一场空,不开 long long 见祖宗。

三、B:「MCOI-05」魔仙

传送门:https://www.luogu.com.cn/problem/P7567?contestId=30514

这道题其实是有规律的。

首先,若这个数不能被4整除,必无解。

若这个数能被4整除,必有解。至于规律,见代码。

$AC$ 代码:

#include<cstdio>
using namespace std;
int n,t;
int magic[1000005];
int main()
{
	//cin>>t;
	scanf("%d",&t);
	for(int time=0;time<t;time++)
	{
		//cin>>n;
		scanf("%d",&n);
		if(n%4!=0)
		{
			printf("w33zAKIOI\n");
			continue;
		}
		else if(n%8==0)
		{
			printf("2 %d",n/2);
			int prt_cnt=2;
			for(int i=1;i<=2+n/2;i++)
			{
				printf(" -1");
				prt_cnt++;
			}
			for(int i=1;i<=n-prt_cnt;i++)
			{
				printf(" %d",((i%2==0)?-1:1));
			}
			printf("\n");
		}
		else
		{
			printf("-2 %d",n/2);
			int prt_cnt=2;
			for(int i=1;i<=n/2-2;i++)
			{
				printf(" -1");
				prt_cnt++;
			}
			for(int i=1;i<=n-prt_cnt;i++)
			{
				printf(" %d",((i%2==0)?-1:1));
			}
			printf("\n");
		}
	}
	return 0;
}

记录:https://www.luogu.com.cn/record/50155828

四、总分

这场比赛我共获得 $215$ 分($D$ 题骗了 $15$ 分),第 $110$ 名。

五、花絮

前面说过,我在 $D$ 题骗了 $15$ 分,而我手欠也报了 $Div.1$,惊讶地发现 $Div.2$ 的后两题就是 $Div.1$ 的前两题。

于是,我把 $Div.2$ 的 $D$ 题骗分代码照搬到 $Div.1$ 的 $B$ 题,也成功地拿到了 $15$ 分。

$Div.2$ 的 $D$ 题的骗分代码:

#include<cstdio>
using namespace std;
int n,m,k;
int main()
{
	scanf("%d%d%d",&n,&m,&k);
	if(n==1&&m==1)
	{
		printf("YES\n\n1 1\n");
		return 0;
	}
	else if((n==3&&m==3&&k==2)||k==1)
	{
		printf("NO\n");
		return 0;
	}
	else if(n==6&&m==4&&k==4)
	{
		printf("YES\nRRRDLLLDRRRDLLLDRRRDLLL\n1 1\n");
		return 0;
	}
	else if(k==0)
	{
		printf("NO\n");
		return 0;
	}
	if(k>m-1)
	{
		if(m-1==0&&k<=n-1)
		{
			printf("NO\n");
			return 0;
		}
		printf("YES\n");
		if(n%2==0)
		{
			for(int i=1;i<=n/2;i++)
			{
				for(int j=0;j<m-1;j++)
				{
					printf("R");
				}
				printf("D");
				for(int j=0;j<m-1;j++)
				{
					printf("L");
				}
				if(i!=n/2)
				{
					printf("D");
				}
			}
			printf("\n1 1\n");
		}
		else
		{
			for(int i=1;i<=n/2;i++)
			{
				for(int j=0;j<m-1;j++)
				{
					printf("R");
				}
				printf("D");
				for(int j=0;j<m-1;j++)
				{
					printf("L");
				}
				printf("D");
			}
			for(int j=0;j<m-1;j++)
			{
				printf("R");
			}
			printf("\n1 1\n");
		}
		return 0;
	}
	else if(k>n-1)
	{
		if(n-1==0&&k<=m-1)
		{
			printf("NO\n");
			return 0;
		}
		printf("YES\n");
		if(m%2==0)
		{
			for(int i=1;i<=m/2;i++)
			{
				for(int j=0;j<n-1;j++)
				{
					printf("D");
				}
				printf("R");
				for(int j=0;j<n-1;j++)
				{
					printf("U");
				}
				if(i!=m/2)
				{
					printf("R");
				}
			}
			printf("\n1 1\n");
		}
		else
		{
			for(int i=1;i<=m/2;i++)
			{
				for(int j=0;j<n-1;j++)
				{
					printf("D");
				}
				printf("R");
				for(int j=0;j<n-1;j++)
				{
					printf("U");
				}
				printf("R");
			}
			for(int j=0;j<n-1;j++)
			{
				printf("D");
			}
			printf("\n1 1\n");
		}
		return 0;
	}
}

要不是题目开了 Subtask,我还能骗更多分。

六、后记

这次 $05$ 月月赛起码比上次 $04$ 月月赛的 $100/400$ 分好多了。


文章作者: cyrxdzj
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cyrxdzj !
  目录