[CSP-S 2021] 廊橋分配


我是傻逼

看見了這個題面但是忽略了很重要的一句:我們的飛機對一廊橋來講是先到先得的.

因為我沒看見這個重要條件`,所以我采用了單調隊列的做法(我的做法是合並兩個飛機(我的'飛機'可能是兩個及以上)然后左右端點合並,以飛機數優先(讓數量單調增)),很顯然是fake的,在這之前我想過三分以及dp的,但是鑒於數據范圍dp很顯然不是,然后更明顯的這個函數不是單峰的(因為有國內和國外兩個航班)

 

 后續待更

#include<bits/stdc++.h>

using namespace std;
const int N=1e5+7;


int n,m1,m2;
struct node
{
    int l,r;
}a1[N],a2[N];
int cnt;
bool cmp(node x,node y)
{
    if(x.l==y.l)
    return x.r<y.r;
    else
    return x.l<y.l;
}

priority_queue< pair<int ,int > >q;
priority_queue< int >qid;
int v[N];
int siz1[N],siz2[N];

void init()
{
    for(int i=1;i<=n;i++)
    siz1[i]+=siz1[i-1];
    
    while(q.size())
    q.pop();
    while(qid.size())
    qid.pop();
    
    for(int i=1;i<=n;i++) 
    qid.push(-i);
    cnt=0;
    return ;
}
int maxx;

int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m1>>m2;
    for(int i=1;i<=m1;i++)
    {
        cin>>a1[i].l>>a1[i].r;
    }
    for(int i=1;i<=m2;i++)
    {
        cin>>a2[i].l>>a2[i].r;
    }
    sort(a1+1,a1+1+m1,cmp);
    sort(a2+1,a2+1+m2,cmp);
    for(int i=1;i<=n;i++)
    {
        qid.push(-i);        
    }
    for(int i=1;i<=m1;i++)
    {
        if(cnt)
        {
            while(cnt&&-q.top().first<a1[i].l)
            {
                cnt--;    
                qid.push(-q.top().second);
                q.pop();
            }
            
        }
        if(qid.size())
        {
            int pos=-qid.top();
            qid.pop();
            siz1[pos]++;
            q.push({-a1[i].r,pos});
            cnt++;
        }
        
    }
    init();

    for(int i=1;i<=m2;i++)
    {
        if(cnt)
        {
            while(cnt&&-q.top().first<a2[i].l)
            {
                cnt--;    
                qid.push(-q.top().second);
                q.pop();
            }
            
        }
        if(qid.size())
        {
            int pos=-qid.top();
            qid.pop();
            siz2[pos]++;
            q.push({-a2[i].r,pos});
            cnt++;
        }
        
    }
    for(int i=1;i<=n;i++)
    siz2[i]+=siz2[i-1];
    
    for(int i=0;i<=n;i++)
    {
        maxx=max(maxx,siz1[i]+siz2[n-i]);
    }
    cout<<maxx;
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM