这个题方法还挺多的,不过洛谷上要输出方案所以用堆最方便
先按起始时间从小到大排序。 我用的是greater重定义优先队列(小根堆)。用pair存牛棚用完时间(first)和牛棚编号(second),每次查看队首的first是否比当前牛的起始时间早,是则弹出队首记录当前牛的答案,再把新的pair放进去,否则增加牛棚,同样要塞进队里#include#include #include #include using namespace std;const int N=200005;int n,ans,bl[N];priority_queue ,vector >,greater > >q;struct qwe{ int l,r,id;}a[N];bool cmp(const qwe &a,const qwe &b){ return a.l '9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f;}int main(){ n=read(); for(int i=1;i<=n;i++) a[i].l=read(),a[i].r=read(),a[i].id=i; sort(a+1,a+1+n,cmp); ans=1,bl[a[1].id]=1; q.push(make_pair(a[1].r,1)); for(int i=2;i<=n;i++) { if(q.top().first
如果不输出方案的话,因为时间范围是1e6,所以直接差分做即可
#include#include using namespace std;const int N=1000005;int n,ans,mx,t[N];int read(){ int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f;}int main(){ n=read(); for(int i=1;i<=n;i++) { int l=read(),r=read(); t[l]++,t[r+1]--; mx=max(mx,r); } for(int i=1;i<=mx;i++) ans=max(ans,t[i]+=t[i-1]); printf("%d\n",ans); return 0;}