【区间集合运算】

区间补集

题1. 蓝彗星

链接:
https://ac.nowcoder.com/acm/contest/23479/C

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

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


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

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

遍历
为B
为R
接上上一段B区间
没有接上上一段B区间
对B区间进行切割保证B区间不能出现R区间
对R区间右端点进行更新
对B区间进行扩展更新
答案加上上一段B区间的长度并重新更新B区间左右端点
#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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行码棋

码字好辛苦,总结好吃力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值