如代码所示:
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn=1e5+7;
struct air {
int in,out;
bool operator <(const air &other) const {
return in<other.in;
}
};
int n,m1,m2;
air in[maxn],out[maxn];
inline int R();
priority_queue <int,vector<int>,greater<int> > Q;//存储廊桥有几架飞机出去的时间
int kans[maxn];
inline int work(int kin) {
if(kans[kin])return kans[kin];
int kout=n-kin,ans=0;
for(int i=1; i<=m1; i++) {
while(!Q.empty()&&in[i].in>Q.top()) {
Q.pop();
}
if(Q.size()<kin) {
ans++;
Q.push(in[i].out);
}
}
priority_queue <int,vector<int>,greater<int> > Q1;
swap(Q1,Q);
for(int i=1; i<=m2; i++) {
while(!Q.empty()&&out[i].in>Q.top()) {
Q.pop();
}
if(Q.size()<kout) {
ans++;
Q.push(out[i].out);
}
}
priority_queue <int,vector<int>,greater<int> > Q2;
swap(Q2,Q);
return ans;
}
int main( ) {
cin>>n>>m1>>m2;
for(register int i=1; i<=m1; i++) {
in[i].in=R(),in[i].out=R();
}
for(register int i=1; i<=m2; i++) {
out[i].in=R(),out[i].out=R();
}
sort(in+1,in+m1+1);
sort(out+1,out+m2+1);
int ANS=0;
if((long long)n*(m1+m2)<7e7){
for(register int i=0;i<=n;i++){
ANS=max(ANS,work(i));
}
}else
{
int l=0,r=n;
while(r-l>10){
int k=(r-l)/3;
int ml=l+k,mr=r-k;
int ansl=work(ml),ansr=work(mr);
if(ansl<ansr){
l=ml;
}else if(ansl>ansr){
r=mr;
}else {
l=ml;
r=mr;
}
}
for(int i=max(0,l-10);i<=min(n,l+10);i++){
ANS=max(ANS,work(i));
}
}
cout<<ANS;
return 0;
}
inline int R() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while('0'<=ch&&ch<='9') {
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
如代码所示,运用了小数据暴力,大数据三分的思想,可以拿95分。 但是若将(1)改成(2),就只能得75分
if((long long)n*(m1+m2)<7e7){
for(register int i=0;i<=n;i++){
ANS=max(ANS,work(i));
}
if(n*(m1+m2)<7e7){
for(register int i=0;i<=n;i++){
ANS=max(ANS,work(i));
}
这是为什么呢?让我们看一组测试点: 70000 50000 50000 338731 1909627 341955 1871866 30 1000040 ...
n,m1,m2均为int。若直接将n*(m1+m2),则 70000*100000>2147483647,结果为负数。