Educational Codeforces Round 118 div.2 A-E题解

视频讲解:咕了 ,推荐看wls的视频题解

A. Long Comparison

题目大意

有两个数,它们都用同一种格式表示:一个正整数 x ( 1 ≤ x ≤ 1 0 6 ) x(1 \leq x \leq 10^6) x(1x106) ,后面附加 p ( 0 ≤ p ≤ 1 0 6 ) p(0 \leq p \leq 10^6) p(0p106) 0 0 0
现在给定两个数,求他们的大小比较关系。

题解

由于 1 ≤ x ≤ 1 0 6 1 \leq x \leq 10^6 1x106 ,因此若 p p p 相差超过 6 6 6 ,则直接比较 p p p 的大小。反之在 p 1 , p 2 p1,p2 p1,p2 都减去 min ⁡ ( p 1 , p 2 ) \min(p1,p2) min(p1,p2) 后,还原处原数进行比较。

参考代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

int main()
{
	int T;
	ll x1,x2,p1,p2;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld%lld%lld%lld",&x1,&p1,&x2,&p2);
		if(p1+6<p2)
			puts("<");
		else if(p1>p2+6)
			puts(">");
		else
		{
			x1*=pow(10,max(0ll,p1-p2));
			x2*=pow(10,max(0ll,p2-p1));
			if(x1>x2)
				puts(">");
			else if(x1==x2)
				puts("=");
			else
				puts("<");
		}
	}
}

B. Absent Remainder

题目大意

给定长度为 n ( 2 ≤ n ≤ 2 ⋅ 1 0 5 ) n(2 \leq n \leq 2 \cdot 10^5) n(2n2105) 的互不相同的正整数序列 a 1 , a 2 , . . . , a n ( 1 ≤ a i ≤ 1 0 6 ) a_1,a_2,...,a_n(1 \leq a_i \leq 10^6) a1,a2,...,an(1ai106) ,求 ⌊ n 2 ⌋ \lfloor \frac{n}{2} \rfloor 2n 对不同的正整数 对 x , y x,y x,y ,满足以下条件:

  • x ≠ y x \neq y x=y
  • x x x y y y 都在 a a a 中出现;
  • x m o d    y x \mod y xmody 不在 a a a 中出现;

注意,某些 x x x y y y 可以属于不同对。
如果有多组解,输出任意一组即可。可以证明至少存在一个解。

题解

a a a 从小到大排序后,易得 a i m o d    a 1 < a 1 a_i \mod a_1<a_1 aimoda1<a1 ,即不在 a a a 中出现。因此直接构造 ⌊ n 2 ⌋ \lfloor \frac{n}{2} \rfloor 2n ( a i , a 1 ) (a_i,a_1) (ai,a1) 即可,注意 i > 1 i>1 i>1

参考代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int MAXN=200200;
int a[MAXN];

int main()
{
	int T;
	int n,i;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+n+1);
		for(i=2;i<=n/2+1;i++)
		{
			printf("%d %d\n",a[i],a[1]);
		}
	}
}

C. Poisoned Dagger

题目大意

Monocarp在玩一个电脑游戏。在游戏种,他的角色必须杀死一条龙。战斗会持续 10 0 500 100^{500} 100500 秒,期间Monocarp会用毒匕首攻击龙 n ( 1 ≤ n ≤ 100 ) n(1 \leq n \leq 100) n(1n100) 次。第 i i i 次攻击在战斗开始后第 a i ( 1 ≤ a i ≤ 1 0 9 , a i < a i + 1 ) a_i(1 \leq a_i \leq 10^9,a_i<a_{i+1}) ai(1ai109,ai<ai+1) 秒发生。毒匕首本身不会对龙造成伤害,但会对龙施加中毒效果,在接下来 k k k 秒内每秒造成 1 1 1 点伤害(从龙被匕首刺伤的同一秒开始)。如果龙已经中毒,则会刷新持续时间。

已知龙有 h ( 1 ≤ h ≤ 1 0 18 ) h(1 \leq h \leq 10^{18}) h(1h1018) 点生命,如果在战斗中队龙造成至少 h h h 点伤害,则会成功杀死这条龙。求杀死这条龙的情况下, k k k 的最小值。

题解

二分答案,对于每个答案以 O ( n ) O(n) O(n) 复杂度进行模拟。

参考代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int MAXN=110;
ll n,h,a[MAXN];

bool check(ll x)
{
	ll last=h-x;
	for(int i=1;i<=n;i++)
		last-=min(x,a[i]-a[i-1]);
	if(last<=0)
		return true;
	else
		return false;
}

int main()
{
	int T,i;
	ll lef,rig,mid;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld%lld",&n,&h);
		for(i=1;i<=n;i++)
			scanf("%lld",&a[i]);
		a[0]=a[1];
		lef=1,rig=h;
		while(lef<=rig)
		{
			mid=(lef+rig)>>1;
			if(check(mid))
				rig=mid-1;
			else
				lef=mid+1;
		}
		printf("%lld\n",lef);
	}
}

D. MEX Sequences

题目大意

如果一个整数序列 x 1 , x 2 , . . . , x k x_1,x_2,...,x_k x1,x2,...,xk 满足 ∀ i ( 1 ≤ i ≤ k ) \forall i(1 \leq i \leq k) i(1ik) ∣ x i − M E X ( x 1 , x 2 , . . . , x i ) ∣ ≤ 1 |x_i-MEX(x_1,x_2,...,x_i)| \leq 1 xiMEX(x1,x2,...,xi)1 ,则称其为MEX正确。其中 M E X ( x 1 , . . . , x k ) MEX(x_1,...,x_k) MEX(x1,...,xk) 表示不属于集合 x 1 , . . . , x k x_1,...,x_k x1,...,xk 的最小非负整数。

现在给定一个长度为 n ( 1 ≤ n ≤ 5 ⋅ 1 0 5 ) n(1 \leq n \leq 5 \cdot 10^5) n(1n5105) 大小的非负整数序列 a a a ,求其非空MEX正确的子序列有多少个,答案对 998244353 998244353 998244353 取模。

题解

考虑合法子序列,只存在以下两种可能:

  1. 不下降序列,即 0...1...2...3...4... 0...1...2...3...4... 0...1...2...3...4...
  2. 前面是不下降序列,后面是在 x x x x + 2 x+2 x+2 间反复,即 0... x . . . ( x + 2 ) . . . x . . . ( x + 2 ) . . . 0...x...(x+2)...x...(x+2)... 0...x...(x+2)...x...(x+2)...

从左到右遍历序列,设

  • f x f_x fx 表示之前的序列中属于第一种情况的 M E X MEX MEX 值为 x x x 的子序列方案数;
  • g x g_x gx 表示之前的序列中属于第二种情况的 M E X MEX MEX 值为 x x x 的子序列方案数;

若当前遍历到 a i a_i ai ,则以 a i a_i ai 结尾的合法子序列对答案的贡献有以下几项:

  • M E X = a i + 1 MEX=a_i+1 MEX=ai+1 的贡献 f a i + f a i + 1 + g a i + 1 f_{a_i}+f_{a_i+1}+g_{a_i+1} fai+fai+1+gai+1
  • M E X = a i − 1 MEX=a_i-1 MEX=ai1 的贡献 f a i − 1 + g a i − 1 f_{a_i-1}+g_{a_i-1} fai1+gai1

添加以 a i a_i ai 结尾的子序列贡献后, f x , g x f_x,g_x fx,gx 有以下变化:

  • f a i + 1 + = f a i + 1 + f a i f_{a_i+1}+=f_{a_i+1}+f_{a_i} fai+1+=fai+1+fai
  • g a i + 1 + = g a i + 1 g_{a_i+1}+=g_{a_i+1} gai+1+=gai+1
  • g a i − 1 + = g a i − 1 + f a i − 1 g_{a_i-1}+=g_{a_i-1}+f_{a_i-1} gai1+=gai1+fai1

参考代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int MAXN=500500;
const ll mod=998244353;
int a[MAXN];
ll f[MAXN],g[MAXN];

int main()
{
	int T,n,i;
	ll ans;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		memset(f,0,sizeof(ll)*(n+10));
		memset(g,0,sizeof(ll)*(n+10));
		f[0]=1;
		ans=0;
		for(i=1;i<=n;i++)
		{
			ans+=f[a[i]]+f[a[i]+1]+g[a[i]+1];
			f[a[i]+1]=(f[a[i]+1]*2ll+f[a[i]])%mod;
			if(a[i])
			{
				ans+=g[a[i]-1]+f[a[i]-1]%mod;
				g[a[i]-1]=(g[a[i]-1]*2ll+f[a[i]-1])%mod;
			}
			ans%=mod;
			g[a[i]+1]=g[a[i]+1]*2ll%mod;
		}
		printf("%lld\n",ans);
	}
}

E. Crazy Robot

题目大意

有一个 n ∗ m    ( 1 ≤ n , m ≤ 1 0 6 , n ⋅ m ≤ 1 0 6 ) n*m \;(1 \leq n,m \leq 10^6,n \cdot m \leq 10^6) nm(1n,m106,nm106) 大小的网格,每个单元格是空的或被阻塞的。其中有个空的单元格内有一个实验室。超出网格边界的其他单元格都是被阻塞的。

有一个机器人从实验室中逃出,处于某个空的单元格中。你可以命令其向上下左右四个方向之一移动到相邻的单元格,但机器人不会听从指令,它会选择一个与命令方向不同的其他方向,且该方向上的单元格是空的。如果存在,则其会移动到那个方向,否则什么都不做。

现在希望机器人回到实验室。对于每个单元格,判断其能否被迫回到实验室。被迫是指,在机器人每一步后,都可以向其发送一个命令,无论机器人选择什么不同方向,最终都会回到实验室。

题解

对于一个格子来说,若其周围都是 ‘+’ 或 ‘L’ ,只有最多一个相邻格子是 ‘.’ ,则该格子也是 ‘+’ 。
当一个格子变为 ‘+’ 后,其周围格子也可能变成 ‘+’ 。
因此,采用BFS实现即可(不怕 1 0 6 10^6 106 爆栈也可以用dfs)。

参考代码

#include <bits/stdc++.h>
typedef long long ll;
#define mkp make_pair
#define pii pair<int,int>
using namespace std;

const int MAXN=1000100;
const int g[2][4]={{-1,1,0,0},{0,0,-1,1}};
char mz[MAXN];
queue<pii> q;

int main()
{
	int T,n,m,x,y,i,j,nx,ny,d;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		for(i=0;i<n;i++)
			for(j=0;j<m;j++)
			{
				scanf(" %c",&mz[i*m+j]);
				if(mz[i*m+j]=='L')
					q.push(mkp(i,j));
			}
		while(!q.empty())
		{
			pii now=q.front();
			q.pop();
			for(i=0;i<4;i++)
			{
				x=now.first+g[0][i];
				y=now.second+g[1][i];
				if(x>=0&&x<n&&y>=0&&y<m
					&&mz[x*m+y]=='.')
				{
					d=0;
					for(j=0;j<4;j++)
					{
						nx=x+g[0][j];
						ny=y+g[1][j];
						if(nx>=0&&nx<n&&ny>=0&&ny<m
							&&mz[nx*m+ny]=='.')
							d++;
					}
					if(d<=1)
					{
						mz[x*m+y]='+';
						q.push(mkp(x,y));
					}
				}
			}
		}
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
				printf("%c",mz[i*m+j]);
			puts("");
		}
	}
}

F. Tree Coloring

题目大意

给定一棵包含 n ( 2 ≤ n ≤ 250000 ) n(2 \leq n \leq 250000) n(2n250000) 个节点的有根树,编号从 1 1 1 n n n ,根节点为 1 1 1 号节点。

现在需要将所有节点染为 1 1 1 n n n n n n 种颜色,每种颜色恰好对应一个节点。设 c i c_i ci 为节点 i i i 的颜色, p i p_i pi 是节点 i i i 的父亲。如果不存在 k ( 1 < k ≤ n ) k(1 < k \leq n) k(1<kn) 满足 c k = c p k − 1 c_k=c_{p_k}-1 ck=cpk1 ,则称该染色方案为漂亮的。

求所有漂亮的染色方案数,答案对 998244353 998244353 998244353 取模。

题解

TBD

参考代码


  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值