呜呜呜~~~被自己坑了
查看原帖
呜呜呜~~~被自己坑了
376452
colin_lord楼主2021/10/25 21:22

明明就是维护一下空机场的最低编号就可以过得,我居然没想到多开一个优先队列,啊啊啊~~拜拜了noip

不出意料AFO了

改前代码

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

const int N = 100010;
int rd()
{
    int al = 0 , f = 1; char b = getchar();
    while(!isdigit(b)){if(b == '-') f = -1;b = getchar();}
    while(isdigit(b)){al = al * 10 + b - '0';b = getchar();}return al * f;
}

int n , m1 , m2 , maxn = -1 , cnt = 0;
struct node{
    int rt , lt;
    bool operator <(const node &a)const{
        return rt < a.rt;
    }
}a[N] , b[N];
struct card{
    int x , id;
    bool operator <(const card &a)const{
        return x > a.x;
    }
};
priority_queue< card > q;
int c1[N] , c2[N];

int main()
{
    n = rd() , m1 = rd() , m2 = rd();
    for(int i = 1;i <= m1;i ++) a[i].rt = rd() , a[i].lt = rd();
    for(int i = 1;i <= m2;i ++) b[i].rt = rd() , b[i].lt = rd();
    
    sort(a + 1 , a + m1 + 1);
    sort(b + 1 , b + m2 + 1);

    int id = 1 , cnt = 0; 
    for(int i = 1;i <= m1;i ++){
        card k;
        while(q.size()){
            k = q.top();
            if(a[i].rt > k.x){
                q.pop();
                id = min(k.id , id);
            }else break;
        }
        if(id > cnt && q.size() >= cnt){cnt ++; q.push((card){a[i].lt , cnt}) , c1[cnt] ++; id = cnt + 1;}
        else{q.push((card){a[i].lt , id}) , c1[id] ++; id = q.size() + 1;}
    }
    
    while(q.size()) q.pop();
    cnt = 0;id = 1;

    for(int i = 1;i <= m2;i ++){
        card k;
        while(q.size()){
            k = q.top();
            if(b[i].rt > k.x) q.pop() , id = min(k.id , id);
            else break;
        }
        if(id > cnt && q.size() >= cnt){cnt ++ , q.push((card){b[i].lt , cnt}) , c2[cnt] ++ , id = cnt + 1;}
        else{q.push((card){b[i].lt , id}) , c2[id] ++; id = q.size() + 1;}
    }

    for(int i = 1;i <= n;i ++) c1[i] += c1[i - 1];
    for(int i = 1;i <= n;i ++) c2[i] += c2[i - 1];

    for(int i = 0;i <= n;i ++){
        maxn = max(maxn , c1[i] + c2[n - i]);
    }cout << maxn << endl;
}

改后代码 跑的特别快!!!

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

const int N = 100010;
int rd()
{
    int al = 0 , f = 1; char b = getchar();
    while(!isdigit(b)){if(b == '-') f = -1;b = getchar();}
    while(isdigit(b)){al = al * 10 + b - '0';b = getchar();}return al * f;
}

int n , m1 , m2 , maxn = -1 , cnt = 0;
struct node{
    int rt , lt;
    bool operator <(const node &a)const{
        return rt < a.rt;
    }
}a[N] , b[N];
struct card{
    int x , id;
    bool operator <(const card &a)const{
        return x > a.x;
    }
};
priority_queue< card > q;
priority_queue< int> p;
int c1[N] , c2[N];


int main()
{
    n = rd() , m1 = rd() , m2 = rd();
    for(int i = 1;i <= m1;i ++) a[i].rt = rd() , a[i].lt = rd();
    for(int i = 1;i <= m2;i ++) b[i].rt = rd() , b[i].lt = rd();
    
    sort(a + 1 , a + m1 + 1);
    sort(b + 1 , b + m2 + 1);

    int id = 1 , cnt = 0; 
    for(int i = 1;i <= m1;i ++){
        card k;
        while(q.size()){
            k = q.top();
            if(a[i].rt > k.x) q.pop() , p.push(- k.id);
            else break;
        }
        
        if(!p.size()) c1[++ cnt] ++ , q.push((card){a[i].lt , cnt});
        else q.push((card){a[i].lt , -p.top()}) , c1[- p.top()] ++ , p.pop();
    }
    
    while(q.size()) q.pop();
    while(p.size()) p.pop();
    cnt = 0;id = 1;

    for(int i = 1;i <= m2;i ++){
        card k;
        while(q.size()){
            k = q.top();
            if(b[i].rt >= k.x) q.pop() , p.push(- k.id);
            else break;
        }
        if(!p.size()) c2[++ cnt] ++ , q.push((card){b[i].lt , cnt});
        else q.push((card){b[i].lt , -p.top()}) , c2[- p.top()] ++ , p.pop();
    }

    for(int i = 1;i <= n;i ++) c1[i] += c1[i - 1];
    for(int i = 1;i <= n;i ++) c2[i] += c2[i - 1];
    for(int i = 0;i <= n;i ++){
        maxn = max(maxn , c1[i] + c2[n - i]);
    }cout << maxn << endl;
}
2021/10/25 21:22
加载中...