1、B站视频链接:A21 排序 区间合并_哔哩哔哩_bilibili
题目链接:火烧赤壁 - 洛谷
#include <bits/stdc++.h>
using namespace std;
#define N 20005
struct line{
int l,r;
bool operator<(line &t){
return l<t.l;
}
}a[N];//定义结构体数组进行排序,
//记录每条线段的起点和终点
int n,st,ed,sum;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
}
sort(a+1,a+1+n);
st=a[1].l;ed=a[1].r;
sum+=a[1].r-a[1].l;//从第一段开始
for(int i=2;i<=n;i++){
if(a[i].l<=ed){
if(a[i].r<ed){//覆盖
continue;//跳过
}else{//重叠了 加上多出来的那一段
st=ed;
ed=a[i].r;
sum+=ed-st;
}
}else{
st=a[i].l;
ed=a[i].r;
sum+=ed-st;
}
}
cout<<sum<<endl;
return 0;
}
2、B站视频链接:A22 堆 序列合并_哔哩哔哩_bilibili
题目链接:序列合并 - 洛谷
#include <bits/stdc++.h>
using namespace std;
const int N=100005;
int a[N],b[N],id[N];
priority_queue<pair<int,int>,
vector<pair<int,int>>,
greater<pair<int,int>>>q;
//id[i]记录b[i]搭档a的下标
//q:小根堆,<两数和,组的下标>
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
id[i]=1;
q.push({a[1]+b[i],i});
}
while(n--){
printf("%d ",q.top().first);
int i=q.top().second;q.pop();
q.push({a[++id[i]]+b[i],i});
}
return 0;
}