题解:P9426 [蓝桥杯 2023 国 B] 抓娃娃
大致思路:
此题的关键在于我们不难发现,如果我们选择了线段的一半及以上,无论从左往右,还是从右往左,抑或中间断开,它都必定包含了这条线段的中点。那么我们就可以在输入的时候,记录它的中点并放在数组里面,然后进行一个简单的前缀和预处理,最后统计并输出一个区间框住的线段即可。
细节处理:
此题也没什么太大的坑,就是在实现的时候可能会出现中点是个小数的情况,但是也很好处理,比较不动脑子的方法就是判断下如果中点的值除以
代码:
#include <bits/stdc++.h>
using namespace std;
int a[1000005];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n , m;
cin >> n >> m;
for(int i = 1 ; i <= n ; ++i) {
int l , r;
cin >> l >> r;
if((l + r) % 2 == 1) a[(l + r) / 2 + 1]++;
else a[(l + r) / 2]++;
}
for(int i = 1 ; i <= 1e6 ; ++i){
a[i] += a[i - 1];
}
for(int i = 1 ; i <= m ; ++i){
int l , r;
cin >> l >> r;
cout << a[r] - a[l - 1] << endl;
}
return 0;
}
最后:
希望这篇题解能帮到各位,因为这道题没有测试点,所以大家都不知道自己正确与否,如果认为题解有误,欢迎指正,不胜感激。