抓娃娃
题目名称:抓娃娃
【问题描述】
小明拿了 $n$ 条线段练习抓娃娃。他将所有线段铺在数轴上,第 $i$ 条线段的左端点在 $l_i$,右端点在 $r_i$。
小明用 $m$ 个区间去框这些线段,第 $i$ 个区间的范围是 $[L_i, R_i]$。
如果一个线段有 至少一半 的长度被包含在某个区间内,则将其视为被这个区间框住。
请计算出每个区间框住了多少个线段?
【输入格式】
输入共 $n+m+1$ 行。
第一行为两个正整数 $n, m$。
后面 $n$ 行,每行两个整数 $l_i, r_i$。
后面 $m$ 行,每行两个整数 $L_i, R_i$。
【输出格式】
输出共 $m$ 行,每行一个整数。
【样例输入】
Plaintext3 2
1 2
1 3
3 4
1 4
2 4
【样例输出】
Plaintext3
2
【评测用例规模与约定】
对于 $20\%$ 的数据,保证 $n, m \le 10^3$。
对于 $100\%$ 的数据,保证 $n, m \le 10^5$, $l_i < r_i$,$0 < l_i, r_i, L_i, R_i \le 10^6$,$\max{r_i - l_i} \le \min{R_i - L_i}$。
$\max{r_i - l_i} \le \min{R_i - L_i}$。
这个条件说明所有线段的长度都小于或等于区间的长度
一个线段一半要被区间包住,说明线段的中点要在区间的范围里面。
要计算一个区间里面可以包住多少线段就转化成了有多少线段中点在区间里面。
由于l和r取中点可能为小数,我们将范围扩大两倍则中点就为l+r,就不能担心小数问题了。同样要注释咱们包住区间的范围也要扩大两倍
using namespace std;
const int MAX_COORD = 2000005;
int main(){
int m,n;
cin>>n>>m;
vector<int>arr(MAX_COORD,0);
vector<int>result(MAX_COORD,0);
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
arr[a+b]+=1;
}
for(int i=1;i<=MAX_COORD;i++)
arr[i]+=arr[i-1];
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
result[i]=arr[2*b]-arr[2*a-1];
}
for(int i=1;i<=m;i++)
cout<<result[i]<<endl;
}
