一、问题描述
二、分析:
此题的问题描述部分的第一句话:“花灯有n个,排列成l行供大家欣赏。”中,“排列成l行”应与本题求解无关。由题意可知:n个花灯被均分为块,在l到r的闭区间内,每走过一个完整的块,则修改次数增加1;而走过的部分不是一个完整的块时,则修改次数将增加每个不完整的块内包含的花灯数。
注意到变量取值范围:1≤n≤250000(1≤≤500),1≤q≤100000,则总计算次数不是非常大的一个数,因此在允许的时间范围内可考虑模拟的方法。
三、代码实现:
#include<iostream>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
int m = (int)sqrt(n);
while (q--) {
int l, r;
cin >> l >> r;
int ans = 0;
while (l <= r) {
// 若当前位置后存在一个完整的块,则结果加1,并向后移动一个块的长度
if (l % m == 1 && l + m - 1 <= r) {
ans++;
l += m;
}
// 若当前位置后不存在一个完整的块,则当前位置后有多少次修改,结果就加多少次
else {
l++;
ans++;
}
}
cout << ans << "\n";
}
}
四、竞赛相关信息
2022-2023年度第四届全国大学生算法设计与编程挑战赛(秋季赛)-大学生竞赛-赛氪2022-2023年度第四届全国大学生算法设计与编程挑战赛(秋季赛),主办方:中国未来研究会大数据与数学模型专业委员会,竞赛时间:2022年10月30,大学生竞赛活动社区-大学生竞赛活动社区https://www.saikr.com/vse/2022autumnOnlineJudgehttp://vj.saikr.com/