AtCoder Beginner Contest 253 A~E 题解

C# NX二次开发-查找连续倒圆角面 可以通过ufun函数 UF_MODL_ask_face_type 和 UF_MODL_ask_face_props 可判断处理选择相应的一组圆角面。在QQ群里有人问怎么通过一个选择一个倒圆角面来自动选中一组倒圆角面。这个是初步思路,如果有更好的思路可回复讨论一下。 阅读详情

A - Median?

题目大意

给定正整数 a , b , c a,b,c a,b,c,判断 b b b是否为三个数中的中位数(即从小到大排序后是第二个,不是平均数)。
1 ≤ a , b , c ≤ 100 1\le a,b,c\le 100 1≤a,b,c≤100

输入格式

a   b   c a~b~c a b c

输出格式

如果 b b b是三个数中的中位数,输出Yes;否则,输出No。

样例

a a a b b b c c c输出
5 5 5 3 3 3 2 2 2Yes
2 2 2 5 5 5 3 3 3No
100 100 100 100 100 100 100 100 100No

分析

本来就是A题,其实没什么难的,比赛的时候就是看成平均数WA了…(上面应该讲的够清楚了)

当然可以直接将三个数排序(简单粗暴),也可以判断 a ≤ b ≤ c a\le b\le c a≤b≤c和 c ≤ b ≤ a c\le b\le a c≤b≤a中是否有至少一个成立。

代码

#include <cstdio>
using namespace std;

int main()
{
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	puts((a <= b && b <= c) || (c <= b && b <= a)? "Yes": "No");
	return 0;
}

B - Distance Between Tokens

题目大意

在 H × W H\times W H×W的网格上,有恰好两个位置上各有一颗棋子,别的都是空位。
你可以从任意一个棋子开始,通过上下左右移动,前往另一个棋子的位置。
求至少要移动多少次?

输入格式

先是一行 H , W H,W H,W,用空格隔开,然后有 H H H行,每行是一个长度为 W W W的字符串,-表示这个位置是空位,o表示这里有一颗棋子(详见样例)。

输出格式

输出一行,即至少要移动的次数。

样例

样例输入1

2 3
--o
o--

样例输出1

3

样例输入2

5 4
-o--
----
----
----
-o--

样例输出2

4

分析

本题不需要 BFS \text{BFS} BFS,由于没有障碍物,直接找到两颗棋子,并输出 x diff + y diff x_\text{diff}+y_\text{diff} xdiff​+ydiff​(即 x , y x,y x,y的坐标差之和)即可。

代码

#include <cstdio>
#include <vector>
using namespace std;

int main()
{
	int h = 0, w = 0, x1 = -1, y1 = -1, x2 = -1, y2 = -1;
	char c;
	while((c = getchar()) != ' ')
		h = (h << 3) + (h << 1) + (c ^ 48);
	while((c = getchar()) != '\n')
		w = (w << 3) + (w << 1) + (c ^ 48);
	for(; h--; getchar())
		for(int i=w; i--; )
			if(getchar() == 'o')
				if(x1 == -1) x1 = h, y1 = i;
				else { x2 = h, y2 = i; break; }
	printf("%d\n", x1 - x2 + (y1 > y2? y1 - y2: y2 - y1));
	return 0;
}

C - Max - Min Query

题目大意

我们有一个序列 S S S,初始为空。
请处理如下 Q Q Q个操作:

  • 1 x:将 x x x插入至 S S S的末尾。
  • 2 x c:从 S S S中删除 c c c个 x x x,如果不够删就直接删完。
  • 3:求 S S S中最大值与最小值的差。

1 ≤ Q ≤ 2 × 1 0 5 1\le Q\le 2\times 10^5 1≤Q≤2×105
0 ≤ x ≤ 1 0 9 0\le x\le 10^9 0≤x≤109
1 ≤ c ≤ Q 1\le c\le Q 1≤c≤Q

输入格式

Q Q Q
query 1 \text{query}_1 query1​
query 2 \text{query}_2 query2​
⋮ \vdots ⋮
query Q \text{query}_Q queryQ​

输出格式

对于每个操作 3 3 3,输出 S S S中最大值与最小值的差。

分析

典型STL练习题

本题可以用multiset或map解决,这里介绍使用map的方法(仅限C++使用)。
C++中,我们需要用到std::map<int, int>的如下方法:

  • mp[x]或int& operator[](int&& key)
    返回key对应的value的引用,如果之前没有用到过则创建并返回 0 0 0。
    时间复杂度: O ( log ⁡ n ) \mathcal O(\log n) O(logn),其中 n n n为map中元素总数。
  • iterator begin()
    返回最小的元素对应的指针,mp.begin()->first可以获得mp的最小元素
    时间复杂度: O ( 1 ) \mathcal O(1) O(1)
  • iterator rbegin()
    返回最大的元素对应的指针,mp.rbegin()->first可以获得mp的最大元素
    时间复杂度: O ( 1 ) \mathcal O(1) O(1)
  • size_type erase(const int& key)
    将key以及对应的value从map中删除,返回删除的元素个数( 0 0 0或 1 1 1),返回值一般可以忽略。
    时间复杂度: O ( log ⁡ n ) \mathcal O(\log n) O(logn),其中 n n n为map中元素总数。

这时,每个查询都可转换为上述操作,详见代码。

代码

#include <cstdio>
#include <map>
using namespace std;

int main()
{
	int q;
	scanf("%d", &q);
	map<int, int> cnt;
	while(q--)
	{
		int op;
		scanf("%d", &op);
		if(op == 3) printf("%d\n", cnt.rbegin()->first - cnt.begin()->first);
		else if(op == 1)
		{
			int x;
			scanf("%d", &x);
			cnt[x] ++;
		}
		else if(op == 2)
		{
			int x, m;
			scanf("%d%d", &x, &m);
			if(cnt[x] > m) cnt[x] -= m;
			else cnt.erase(x);
		}
	}
	return 0;
}

D - FizzBuzz Sum Hard

题目大意

输出 1 1 1到 N N N之间不是 A A A或 B B B的倍数的数之和。

1 ≤ N , A , B ≤ 1 0 9 1\le N,A,B\le 10^9 1≤N,A,B≤109

输入格式

N   A   B N~A~B N A B

输出格式

输出答案。

分析

根据容斥原理, 1 1 1到 N N N之间是 A A A或 B B B的倍数的数之和为:
( A (A (A的倍数之和 ) + ( B )+(B )+(B的倍数之和 ) − ( )-( )−(同时为 A , B A,B A,B的倍数之和 ) ) )。
又因为同时为 A , B A,B A,B的倍数的数是 [ A , B ] [A,B] [A,B](最小公倍数)的倍数,所以可转化为 ( A (A (A的倍数之和 ) − ( B )-(B )−(B的倍数之和 ) + ( [ A , B ] )+([A,B] )+([A,B]的倍数之和 ) ) )。

再设 f ( N ) = 1 + 2 + ⋯ + N , g ( x , N ) = x f ( ⌊ N X ⌋ ) = ( N f(N)=1+2+\dots+N,g(x,N)=xf(\lfloor\frac N X\rfloor)=(N f(N)=1+2+⋯+N,g(x,N)=xf(⌊XN​⌋)=(N以内所有 x x x的倍数之和 ) ) ),
则答案为
Ans = f ( N ) − g ( A ) − g ( B ) + g ( [ A , B ] ) \text{Ans}=f(N)-g(A)-g(B)+g([A,B]) Ans=f(N)−g(A)−g(B)+g([A,B])
总时间复杂度为求解 [ A , B ] [A,B] [A,B]的复杂度,即 O ( log ⁡ max ⁡ { A , B } ) \mathcal O(\log \max\{A,B\}) O(logmax{A,B})。

代码

这里使用了另一种 g ( x , N ) g(x,N) g(x,N)的求法,思路类似。

#include <cstdio>
using namespace std;

using LL = long long;
inline LL sum(const LL& x, const LL& n)
{
	LL cnt = n / x;
	return x * cnt * (cnt + 1LL) >> 1LL;
}

int main()
{
	int n, a, b;
	scanf("%d%d%d", &n, &a, &b);
	LL x = b, y = a;
	while(b ^= a ^= b ^= a %= b);
	LL t = x / a * y; // t = lcm(a, b)
	printf("%lld\n", sum(1, n) - sum(x, n) - sum(y, n) + sum(t, n));
	return 0;
}

E - Distance Sequence

题目大意

求符合如下条件的 A = ( A 1 , … , A N ) A=(A_1,\dots,A_N) A=(A1​,…,AN​)的个数,对 998244353 998244353 998244353取模:

  • 1 ≤ A i ≤ M 1\le A_i\le M 1≤Ai​≤M( 1 ≤ i ≤ N 1\le i\le N 1≤i≤N)
  • ∣ A i − A i + 1 ∣ ≥ K |A_i-A_{i+1}|\ge K ∣Ai​−Ai+1​∣≥K( 1 ≤ i < N 1\le i<N 1≤i<N)

2 ≤ N ≤ 1000 2\le N\le 1000 2≤N≤1000
1 ≤ M ≤ 5000 1\le M\le 5000 1≤M≤5000
0 ≤ K < M 0\le K<M 0≤K<M

输入格式

N   M   K N~M~K N M K

输出格式

输出符合条件的序列的个数,对 998244353 998244353 998244353取模。

分析

很明显是 DP \text{DP} DP(动态规划)的思路,仿照01背包的方式,我们设计如下状态:
dp ( i , j ) = ( A i = j 的可能数 ) \text{dp}(i,j)=(A_i=j\text{的可能数}) dp(i,j)=(Ai​=j的可能数)
状态转移方程也很简单,即:
dp ( i , j ) = ∑ p = 1 j − k dp ( i − 1 , p ) + ∑ p = j + k m dp ( i − 1 , p ) \text{dp}(i,j)=\sum_{p=1}^{j-k}\text{dp}(i-1,p)+\sum_{p=j+k}^m\text{dp}(i-1,p) dp(i,j)=p=1∑j−k​dp(i−1,p)+p=j+k∑m​dp(i−1,p)
那么,如果直接暴力循环计算,整个算法的时间复杂度是 O ( N M 2 ) \mathcal O(NM^2) O(NM2),显然不能通过。

但是注意到这里有个求和的操作,显然可以用前缀/后缀和优化,用 O ( 1 ) \mathcal O(1) O(1)的时间复杂度求出两个和,因此时间复杂度降到 O ( N M ) \mathcal O(NM) O(NM),可以通过。

最后一个坑,需要注意特判 K = 0 K=0 K=0的情况,答案为 M N   m o d   998244353 M^N\bmod 998244353 MNmod998244353。
本题到此结束。

代码

特判使用快速幂, DP \text{DP} DP建议使用滚动表(又称数组重复利用)技巧,优化后实测:

  • 时间: 49 m s → 39 m s 49\mathrm{ms}\to39\mathrm{ms} 49ms→39ms
  • 空间: 21220 k b → 1664 k b 21220\mathrm{kb}\to1664\mathrm{kb} 21220kb→1664kb
#include <cstdio>
#define maxn 1002
#define maxm 5005
#define MOD 998244353
using namespace std;

using LL = long long;
int qpow(LL a, LL b)
{
	LL ans = 1LL;
	while(b > 0)
	{
		if(b & 1LL) ans = ans * a % MOD;
		a = a * a % MOD, b >>= 1LL;
	}
	return ans;
}

inline void mod(int& x) { if(x >= MOD) x -= MOD; }
int dp[2][maxm];

int main()
{
	int n, m, k;
	scanf("%d%d%d", &n, &m, &k);
	if(k == 0)
	{
		printf("%d\n", qpow(m, n));
		return 0;
	}
	for(int i=1; i<=m; i++)
		dp[0][i] = 1;
	for(int i=1; i<n; i++)
	{
		int c = i & 1, p = c ^ 1, s = 0;
		for(int j=k+1; j<=m; j++)
			mod(s += dp[p][j]);
		for(int j=1; j<=m; j++)
		{
			if(j > k) mod(s += dp[p][j - k]);
			mod(dp[c][j] = s);
			if(j + k <= m)
			{
				mod(s -= dp[p][j + k]);
				if(s < 0) s += MOD;
			}
		}
	}
	int ans = 0, t = n & 1 ^ 1;
	for(int i=1; i<=m; i++)
		mod(ans += dp[t][i]);
	printf("%d\n", ans);
	return 0;
}
第9.3章 从CMake基础到自动驾驶实战:构建跨平台C/C++项目的全能指南 《CMake构建实战:项目开发卷》精要指南 本文系统梳理了许宏旭《CMake构建实战》核心内容,涵盖C++构建全流程: 基础构建:详解MSVC/GCC编译器使用、Makefile编写及静态/动态库构建方法 CMake核心:解析语法结构、变量控制、文件操作等关键命令,阐述项目全生命周期管理 实战应用:通过快速排序、手写数字识别项目演示现代CMake实践,特别针对自动驾驶领域给出多传感器融合、SLAM等场景的CMake配置方案 特色价值:本书填补了官方文档实例不足的空白,提供300+代码示例,是掌握工业级C++ 阅读详情

相关推荐

保姆级教程:用torch.profiler给你的vLLM推理做个“全身体检”(附Perfetto可视化分析)

本文提供了一份详细的vLLM推理性能分析教程,通过torch.profiler和Perfetto工具链实现从数据采集到可视化分析的全流程。文章涵盖了环境配置、性能数据采集、trace文件解析以及Perfetto可视化分析,帮助开发者优化大模型推理服务的性能,显著降低计算资源消耗。

weixin_29041767的博客 359

[abc] abc 253E - Distance Sequence

前言 tag:tag :tag: 计数 前缀和优化dp 难 传送门 : 题意 : 给定N,MN,MN,M询问有多少种序列满足条件 条件如下 : ∀i ,(1≤a[i]≤M)\forall i\ ,(1\le a[i] \le M)∀i ,(1≤a[i]≤M) ∣a∣=N|a|=N∣a∣=N ∣ai−ai+1∣≥K|a_i-a_{i+1}|\ge K∣ai​−ai+1​∣≥K 即长度NNN,值域是MMM,相邻元素的差绝对值大于KKK 思路 : 状态表示 : dp[i][j]dp[i][j]

qq_34364611的博客 250

SAP中MRP运行计划行超限问题的分析与解决

SAP中基于生产性物料的采购特点,通常会采用采购计划协议的方式进行采购。其具体的采购计划通常来自于成品计划独立需求,然后通过物料清单,经由MRP跑出。 在采购计划协议中的计划行中,存在一个计划行号,随着MRP在不断跑出新的计划行,该行号资源会消耗完。当计划行号消耗完后,MRP不会再跑出新的计划行。且在MD04或MD02中看不到类似提示信息。此时可以通过MD05来查看是否出现类似下图的提示信息。 ...

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 3845

ABC 253 题解

ABC253 题解 这场还是偏水。 A 既然是中位数,那么就只需判定 bbb 是否夹在 aaa 和 ccc 之间。 就是这样:a <= b && b <= c || a >= b && b >= c B 暴力。 直接将第一个 o 和第二个 o 得到就行了。 然后求曼哈顿距离:d=∣x0−x1∣+∣y0−y1∣d = |x_0 - x_1| + |y_0 - y_1|d=∣x0​−x1​∣+∣y0​−y1​∣。 int h, w; cin >&gt

weixin_56361327的博客 518

Spring Authorization Server实战:从零搭建OAuth2.1授权中心(含数据库改造)

本文详细介绍了如何从零开始使用Spring Authorization Server搭建符合OAuth2.1规范的授权中心,并完成关键的数据库持久化改造。内容涵盖微服务架构下的统一认证需求、基础配置、数据库表设计、高级特性(如令牌自定义、性能优化)以及与现有系统(如SSO、Gateway网关)的集成实战,为构建生产级授权服务提供完整指南。

weixin_29315091的博客 254

从CCD数据上报看wxHOOK的封号风险与规避

本文深入分析了微信CCD数据上报机制对wxHOOK的检测逻辑与封号风险,揭示了调试器路径暴露、非白名单DLL加载和内存校验失败等关键风险点。通过实战案例和规避方案,帮助开发者理解如何安全使用wxHOOK技术,避免封号风险,包括内存镜像欺骗、内核级隐蔽和硬件辅助方案等高级技巧。

weixin_27875131的博客 632

AtCoder Beginner Contest 253 C~F题解

AtCoder Beginner Contest 253部分题解

weixin_63785821的博客 399

华北理工大学以升实验班蓝桥杯选拔赛题解

文章目录华北理工大学以升实验班蓝桥杯选拔赛题解A:期末考试题目描述题目讲解代码B:月份题目描述题目讲解代码C:打饭题目描述题目讲解代码D : 正弦波信号题目描述题目讲解代码E : 亲爱的长方形题目描述题目讲解代码F:挖金子题目描述题目讲解代码G : 金金的游戏题目描述题目讲解代码H : 区间和题目描述题目讲解代码详细视频讲解请关注华北理工大学b站账号。 华北理工大学以升实验班蓝桥杯选拔赛题解 A:期末考试 题目描述 Description 期末考试过去许多天了,如今成绩都出来了,那么现在让我们对成绩我分个类

Qq1739206233的博客 1128

【最短路径生成树】ABC252 E - Road Reduction

结论:如果对一个点往外做单源最短路,那么到这个图中其他所有点的路径会构成一棵树。因此只需要对1做一次单源最短路,记录路径,输出树边即可。因此这道题最终形成的树其实就是最短路径生成树。为什么是树,因为最短路不存在环。

weixin_62528401的博客 292

【全新官方接口】php检测微信域名拦截,检测微信域名被封

你的域名在微信被拦截的3种常见情况 1、域名因违规或有风险被拦截(红色拦截) 2、类似taobao.com,douyin.com这种的恶意竞争式拦截,淘宝、抖音等微信的竞争对手一般都是白色拦截(白色拦截) 3、有一个中间页的拦截,需要多次点击按钮才可以跳转到你的域名的,多是一些新型域名后缀,例如.top .xyz .link后缀,这种情况,备案后可以解决(备案拦截) 通过php get_headers()函数就可以分析到结果 这个下标为6是一个URL,在微信访问后正是这个讨厌的页面! 如果切换为

TANKING,开源开发者! 2877

AppFlow实战:零代码将Dify接入企业微信的完整指南

本文提供了一份零代码将Dify AI应用接入企业微信的完整实战指南。通过使用阿里云AppFlow作为无代码连接器,详细讲解了从获取Dify API密钥、创建企业微信应用到配置自动化流程的全过程,帮助团队快速将AI能力无缝融入日常协作,大幅提升工作效率。

php55的博客 808

CodeForces 253E Printer

题目链接 题意:有N份文件需要打印,每行输入该文件传入时间第ti秒,需要打印的时间si秒,和打印优先级pi。每一秒打印机都打印优先级最高的文件,传入的N份文件中有一份优先级为-1代表未知。已知所有文件全部都完成打印的时间为T,求优先级未知的文件的优先级可以为多少,按顺序输出每份文件打印结束的时间。 题解:二分文件的优先级,判断是否成立,最后按输入顺序输出。 #incl

Patchouli_Library的博客 1542

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Atcoder Beginner Contest 253

Atcoder Beginner Contest 253

青少年趣味编程 1097

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

AtCoder Beginner Contest 231-260

AtCoder Beginner Contest 231-260

青少年趣味编程 1658

AtCoder Beginner Contest 246

AtCoder Beginner Contest 246

青少年趣味编程 1200

AtCoder Beginner Contest 238

AtCoder Beginner Contest 238

青少年趣味编程 1141

Atcoder Beginner Contest 225

Atcoder Beginner Contest 225

青少年趣味编程 1010

AtCoder Beginner Contest 275

AtCoder Beginner Contest 275

青少年趣味编程 827

Atcoder Beginner Contest 270

Atcoder Beginner Contest 270

青少年趣味编程 778

AtCoder Beginner Contest 235

AtCoder Beginner Contest 235

青少年趣味编程 1148

AtCoder Beginner Contest 221

AtCoder Beginner Contest 221

青少年趣味编程 1132

AtCoder Beginner Contest 336

AtCoder Beginner Contest 336

青少年趣味编程 917

AtCoder Beginner Contest 148

AtCoder Beginner Contest 148

青少年趣味编程 769

Atcoder Beginner Round 213

Atcoder Beginner Round 213

青少年趣味编程 703

AtCoder Beginner Contest 441

本文汇总了多个AtCoder Beginner Contest 441及相关系列比赛的题解资源,包括Bilibili视频讲解(ABC441赛时6题解析、VP比赛实录等)、优快云博客的技术解析(如树状数组应用、E题字符串处理等),以及知乎专栏的系统性题解。内容涵盖ABC440-ABC255等多场比赛,涉及算法知识点讲解和代码实现,适合备赛者参考学习。资源链接形式多样,包含视频、博客和专栏文章,为不同学习偏好的编程竞赛爱好者提供丰富的学习材料。

青少年趣味编程 436

AtCoder Beginner Contest 264

AtCoder Beginner Contest 264

青少年趣味编程 696

AtCoder Beginner Contest 241-260

本文集合了多个编程竞赛(AtCoder、Codeforces)的题目解析与资源汇总,涵盖AtCoder Beginner Contest 241-260及Codeforces Round 881-1076的赛题分析。同时整理了信奥赛(CSP-J/S、NOIP、NOI省选)的备考资源,包括题单推荐、数学与数据结构学习资料(如微积分入门、数论精要)、OJ平台导航及真题解析,并附有英语、物理等学科辅助学习资料。适合算法竞赛选手系统化备赛参考,内容持续更新至2026年。

青少年趣味编程 59
上一篇: AtCoder Beginner Contest 252 A~G 题解
下一篇: AtCoder Beginner Contest 254 A~E 题解
GoodCoder666
博客等级 码龄7年 2320粉丝 85原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值