【区间集合运算】

247 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

区间补集

题1. 蓝彗星

链接:
ac.nowcoder.com/acm/contest…

有两个区间,一个B代表的区间,一个R代表的区间,求只出现B而不出现R的区间长度。即在B区间下的R区间的补集。

红蓝彗星会在某一段时间出现t秒后消失,给出两个彗星出现的开始时间,求只有B没有R的区间长度
在这里插入图片描述


将区间按左端点进行排序,因为每一段区间长度都为t,所以本题处理会有点特殊。

bl,br记录区间B有效(必须没有R)出现的左右端点
rr代表R区间的右端点

#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int N = 1e5+5;
pair<int,char>p[N];

int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>p[i].se;
	for(int i=1;i<=n;i++) cin>>p[i].fi;
	sort(p+1,p+1+n);
    
	ll res = 0;
	int bl = 0,br = 0;
	int rr=0;
	
	for(int i=1;i<=n;i++)
	{
		if(p[i].se == 'B') //yanxu jisuan 
		{
			if(p[i].fi>br)
			{
				res += max(br-bl,0);
				bl = max(rr,p[i].fi);
				br = p[i].fi + k;
			}
			else br = max(p[i].fi + k,br);
		}
		if(p[i].se == 'R')//qiege
		{
			br = min(p[i].fi,br);
			rr = max(rr,p[i].fi + k);
		}

	}
	if(bl and br) res += max(br-bl,0);
	cout<<res<<endl;
	return 0;
}