本文主要是介绍lighoj 1088 Points in Segments | 二分,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
给你n个数,q个区间。让你求出每个区间所包含的数的个数。
思路:
一开始以为是线段树,不过看看数据范围,算了。。。
把n个数sort一遍,然后根据每个区间的两个边值进行二分,得出的结果相减即可。注意细节。
AC代码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAXN = 1e5+5;
const int MAXQ = 5*1e4+5;
const double PI = acos(-1);
int n, q;
int a[MAXN];
int binary(int val)
{int l = 0, r = n-1;int ans = 0, mark = 0;while(l <= r){int mid = (l+r)/2;if(a[mid] <= val){mark = 1;ans = mid, l = mid+1;}elser = mid-1;}return mark == 1 ? ans : ans-1;
}int main()
{int t, cas = 0;scanf("%d", &t);while(t--){scanf("%d%d", &n, &q);for(int i = 0;i < n; i++)scanf("%d", &a[i]);sort(a, a+n);printf("Case %d:\n",++cas);int sl, sr;for(int i = 0;i < q; i++){scanf("%d%d", &sl, &sr);printf("%d\n", binary(sr) - binary(sl-1));}}return 0;
}
这篇关于lighoj 1088 Points in Segments | 二分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!