一个坑点,警示后人!
查看原帖
一个坑点,警示后人!
416511
三重门123456楼主2021/11/9 19:54

十年OI一场空,不开longlong见祖宗

如代码所示:

#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分

(1)

if((long long)n*(m1+m2)<7e7){
	for(register int i=0;i<=n;i++){
		ANS=max(ANS,work(i));
	}
  

(2)

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,结果为负数。

所以,特判一定要加(long long)!

警示后人!

2021/11/9 19:54
加载中...