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