[CSP-S 2021] 廊橋分配
阿新 • • 發佈:2021-10-27
看見了這個題面但是忽略了很重要的一句:我們的飛機對一廊橋來講是先到先得的.
因為我沒看見這個重要條件`,所以我採用了單調佇列的做法(我的做法是合併兩個飛機(我的'飛機'可能是兩個及以上)然後左右端點合併,以飛機數優先(讓數量單調增)),很顯然是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; }