畜栏预定
问题:
本题时间耗费很多的地方在于畜栏的编码如何确定,本来想用数组来存,数组的下标为t[i].r但是这样根本就不现实,然后看了大佬的题解,才明白我可以在结构体中在定义一个变量x代表区间的序号,存放畜栏编号的数组的下标就是此x的值,关于结构体的优先队列
知识点
代码:
#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct R{
int l,r;
int x;
bool operator <(const R&a)const{
return l<a.l;
}
bool operator >(const R&a)const{
return r>a.r;
}
}t[N];
int a[N];
int main(){
int n;
cin>>n;
// priority_queue<R>heap;
for(int i=0;i<n;i++){
cin>>t[i].l>>t[i].r;
t[i].x=i;
}
sort(t,t+n);
priority_queue<R,vector<R>,greater<R>>heap;
int res=0;
for(int i=0;i<n;i++){
auto f=t[i];
if(heap.empty()||f.l<=heap.top().r){
res++;
a[t[i].x]=res;
}
else{
a[t[i].x]=a[heap.top().x];
heap.pop();
}
heap.push(t[i]);
}
cout<<res<<endl;
for(int i=0;i<n;i++){
if(a[i]!=0)
cout<<a[i]<<endl;
}
return 0;
}
或者采用pair的优先队列
代码:
#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct R{
int l,r;
int x;
bool operator <(const R&a)const{
return l<a.l;
}
bool operator >(const R&a)const{
return r>a.r;
}
}t[N];
int a[N];
typedef pair<int,int>p;
int main(){
int n;
cin>>n;
// priority_queue<R>heap;
for(int i=0;i<n;i++){
cin>>t[i].l>>t[i].r;
t[i].x=i;
}
sort(t,t+n);
priority_queue<p,vector<p>,greater<p>>heap;
int res=0;
for(int i=0;i<n;i++){
auto f=t[i];
if(heap.empty()||f.l<=heap.top().first){
res++;
a[t[i].x]=res;
}
else{
a[t[i].x]=a[heap.top().second];
heap.pop();
}
heap.push({t[i].r,t[i].x});
}
cout<<res<<endl;
for(int i=0;i<n;i++){
if(a[i]!=0)
cout<<a[i]<<endl;
}
return 0;
}