区间集合运算

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间集合运算相关的知识,希望对你有一定的参考价值。

区间补集

题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;

以上是关于区间集合运算的主要内容,如果未能解决你的问题,请参考以下文章

高数上第一章知识点总结

jQuery彗星推送,没有彗星服务器

彗星是如何工作的?如何编写彗星聊天应用程序人对人

Tableau 图表大全26之 彗星图

题解 CF786B Legacy

民科吧编程赛 试题