蓝桥杯国赛题·抓娃娃(二分)

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pii;
const int N = 1e5 + 10;
int n, m;

int main()
{
	cin >> n >> m;
	vector<pii>a(n);//存区间的左右端点的坐标
	vector<double>b(m);//存线段中点

	for(int i = 0; i < n; i ++) {
		int L, R; cin >> L >> R;
		double mid = (L + R) / 2.0;
		b[i] = mid;//存入线段中点
	}
	for(int i = 0; i < m; i ++) {
		cin >> a[i].x >> a[i].y;//存入区间
	}
	sort(b.begin(), b.end());//把中点排序

	//auto check1 = [&](int mid, int i) {
	//	return b[mid] >= a[i].x;
	//};

	//auto check2 = [&](int mid, int i) {
	//	return b[mid] <= a[i].y;
	//};

	for(int i = 0; i < m; i ++) {//枚举每个区间
		int L = a[i].x, R = a[i].y;
		int l1 = 0, r1 = n - 1;//n条线段
		while(l1 < r1) {//求中点大于等于L的临界值
			int mid = l1 + r1 >> 1;//除2向下取整
			if(b[mid] >= L)
				r1 = mid;
			else
				l1 = mid + 1;
		}
		int l2 = 0, r2 = n - 1;
		while(l2 < r2) {//求中点小于等于R的临界值
			int mid = l2 + r2 + 1 >> 1;//中间值向上取整,避免死循环
			if(b[mid] <= R)
				l2 = mid;
			else
				r2 = mid - 1;
		}
		if(b[l1] >= L && b[l2] <= R) {//取交集
			cout << l2 - l1 + 1 << endl;
		}else{
      		cout << 0 << endl;
    	}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值