1. 程式人生 > >bzoj 1651: [Usaco2006 Feb]Stall Reservations 專用牛棚【貪心+堆||差分】

bzoj 1651: [Usaco2006 Feb]Stall Reservations 專用牛棚【貪心+堆||差分】

範圍 sort cst tor std 直接 ostream AR pair

這個題方法還挺多的,不過洛谷上要輸出方案所以用堆最方便
先按起始時間從小到大排序。
我用的是greater重定義優先隊列(小根堆)。用pair存牛棚用完時間(first)和牛棚編號(second),每次查看隊首的first是否比當前牛的起始時間早,是則彈出隊首記錄當前牛的答案,再把新的pair放進去,否則增加牛棚,同樣要塞進隊裏

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
const int N=200005;
int
n,ans,bl[N]; priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q; struct qwe { int l,r,id; }a[N]; bool cmp(const qwe &a,const qwe &b) { return a.l<b.l||(a.l==b.l&&a.r<b.r); } 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++) 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<a[i].l) { bl[a[i].id]=q.top().second; q.push(make_pair(a[i].r,q.top().second)); q.pop(); } else { bl[a[i].id]=++ans; q.push(make_pair(a[i].r,ans)); } } printf("%d\n",ans); // for(int i=1;i<=n;i++) // printf("%d\n",bl[i]); return 0; }

如果不輸出方案的話,因為時間範圍是1e6,所以直接差分做即可

#include<iostream>
#include<cstdio>
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;
}

bzoj 1651: [Usaco2006 Feb]Stall Reservations 專用牛棚【貪心+堆||差分】