一、前言
洛谷每个月都会举办月赛,这次我参加的是 $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$ 分好多了。