STL set 95 TLE 求调,码风良好
查看原帖
STL set 95 TLE 求调,码风良好
705702
user100566楼主2024/10/19 15:39

提交记录

#include <cstdio>
#include <algorithm>
#include <set>
using namespace std;

int N, K;
struct SetPoint{
	int x, y;
	inline bool operator<(const SetPoint& b)const{
		return y<b.y;
	};
};
struct Point{
	int x, y;
	set<SetPoint>::iterator iter;
	inline bool operator<(const Point& b)const{
		return x<b.x;
	};
} Points[50000];

int main(){
	scanf("%d%d",&N,&K);
	for(int i=0; i<N; ++i){
		int xi, yi;
		scanf("%d%d",&xi,&yi);
		Points[i] = {xi,yi};
	}
	sort(Points, Points+N);
	int scanLine = -1000000000;
	int nextIn = 0, nextOut = 0;
	set<SetPoint> s;
	long long ans = 0;
	while(nextIn<N){
		int d1 = Points[nextOut].x-scanLine;
		int d2 = Points[nextIn].x-(scanLine+K);
		// 出点 
		if(d1 <= d2){
			scanLine += d1;
			s.erase(Points[nextOut++].iter);
		// 入点 
		}else{
			int x = Points[nextIn].x, y = Points[nextIn].y;
			scanLine += d2;
			SetPoint tp = {0, y-K};
			set<SetPoint>::iterator iter = s.begin();
			while(true){
				iter = upper_bound(iter, s.end(), tp);
				// 无重叠 
				if(iter==s.end() || (*iter).y>=y+K){
					Points[nextIn].iter = s.insert({x, y}).first;
					break;
				// 有重叠 
				}else{
					if(ans){
						ans = -1;
						break;
					}
					ans = (K-x+(*iter).x)*(K-abs(y-(*iter).y));
					++iter;
				}
			}
			if(ans==-1) break;
			++nextIn;
		}
	}
	printf("%lld\n", ans);
	return 0;
}
2024/10/19 15:39
加载中...