YL 模拟赛总结 15

Posted on 2024-03-02 17:09  _XOFqwq  阅读(3)  评论(0编辑  收藏  举报

Problem


T1

感觉是最难的。

考虑贪心。

首先对牛的按左端点进行排序,然后对于每只鸡去考虑匹配哪头牛。

具体地,开一个小根堆,然后对于每只鸡 \(t_i\),将 \(a_i \le t_i\) 的牛放入堆中,此时堆中存放的是候选的牛。

然后对于堆中的牛,将 \(b_i<t_i\) 的牛弹出。

此时堆中的牛均是合法的,累加堆的大小即可。

#include<bits/stdc++.h>
using namespace std;

int c,n,ans;
int t[20031];
struct node{
    int x,y;
    friend bool operator < (node a,node b){
        return a.y>b.y;
    }  
}a[20031];
priority_queue<node> pq;
bool cmp(node a,node b){
    return a.x<b.x;
}

int main(){
    cin>>c>>n;
    for(int i=1;i<=c;i++) cin>>t[i];
    for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
    sort(t+1,t+c+1),sort(a+1,a+n+1,cmp);
    for(int i=1,now=1;i<=c;i++){
        while(now<=n&&a[now].x<=t[i]) pq.push(a[now++]);
        while(!pq.empty()&&pq.top().y<t[i]) pq.pop();
        if(!pq.empty()) ans++,pq.pop();
    }
    cout<<ans;
    return 0;
}

T2

略。

T3

略。

T4

略。