弹幕考察
题目链接:https://www.luogu.com.cn/problem/P2650
题目描述
zeromaker 对弹幕的视野控制有着深刻的研究。 每个弹幕在一段特定的时间内会出现在 zeromaker 的视野内,除此之外的时间都在 zeromaker 看不到的地方。在 zeromaker 看来,视野内的弹幕数量越多,图就越难,因为这意味着 @#¥%。 现在,zeromaker 想要评测这张图的难度,他已经知道了每个弹幕会在什么时候出现在视野内,他想知道,在一段时间内,总共有多少个弹幕出现在他的视野内过。
输入格式
第一行有两个整数 n , m ,表示一共有 n 个弹幕,而 zeromaker 有 m 个问题。
接下来 n 行,每行两个数 a,b,表示这个弹幕 a 秒时出现在 zeromaker 的视野内,出现了 b 秒。 接下来 m 行,每行两个整数 x , y ,表示从 x 秒开始,经过 y 秒,其中有多少个弹幕出现过。
注意:查询区间为左闭右闭,弹幕出现区间为左开右开。
输出格式
m 行,即对于 zeromaker 提出的每个问题的答案。
输入输出样例
输入 #1
3 2 2 5 0 10 5 8 0 6 8 2
输出 #1
3 2
输入 #2
1 2 0 10 9 1 10 1
输出 #2
1 0

思路:
关键要用到 lower_bound函数,
首先我们要用 lower_bound 在弹幕左端点数组的第一个数到最后一个数这个区间内,找到第一个大于或等于查询区间右端点的弹幕左端点的下标,再减去L,这样做就排除了查询区间右端点右边的弹幕左端点的数量,得到了查询区间右端点左边的弹幕左端点的数量。但是想一下就知道,这个数量实际上是大于等于答案的。
所以接着,同理,得到查询区间左端点左边的的弹幕右端点的数量。
这样,我们就得到了两个数量,前者减去后者就是答案。
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int l[100001],r[100001]; 6 int n,m; 7 long long l_problem,r_problem; 8 int ans; 9 cin>>n>>m; 10 11 for(int i=1;i<=n;i++) 12 { 13 cin>>l[i]>>r[i]; 14 r[i]=l[i]+r[i]-1; 15 } 16 17 sort(l+1,l+1+n); 18 sort(r+1,r+1+n); 19 20 for(int i=1;i<=m;i++) 21 { 22 cin>>l_problem>>r_problem; 23 r_problem+=l_problem; 24 25 ans=lower_bound(l+1,l+1+n,r_problem)-l; 26 ans-=lower_bound(r+1,r+1+n,l_problem)-r; 27 cout<<ans<<endl; 28 } 29 return 0; 30 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】