明明就是维护一下空机场的最低编号就可以过得,我居然没想到多开一个优先队列,啊啊啊~~拜拜了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;
}