区间集合运算
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区间的右端点
#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;
以上是关于区间集合运算的主要内容,如果未能解决你的问题,请参考以下文章