set扫描线70pts求调
  • 板块P1382 楼房
  • 楼主REMAC
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/4 13:09
  • 上次更新2023/11/2 15:52:03
查看原帖
set扫描线70pts求调
386892
REMAC楼主2023/10/4 13:09

rt。讨论区的hack都过了。

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

const int maxn=1e5+19;
using Pii=pair<int,int>; 

struct E {
	int t,p;
	bool operator<(const E b) const {
		return p<b.p;
	}
}events[2*maxn];

set<int,greater<int>> st;
vector<Pii> out;

int main() {
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) {
		int h,l,r;
		cin>>h>>l>>r;
//		if(l==r) continue;
		events[2*i-1]=E{h,l};
		events[2*i]=E{-h,r};
	}
	sort(events+1,events+1+2*n);
	st.insert(0);
	out.push_back({INT_MIN,0});
	for(int i=1;i<=2*n;i++) {
		int op=events[i].t,p=events[i].p;
		if(op>0) st.insert(op);
		else st.erase(-op);
		if(events[i+1].p==p) continue;
		int h=*st.begin();
		if((*out.rbegin()).second==h) continue;
		out.push_back(Pii{p,h});
	}
	cout<<2*(out.size()-1)<<endl;
	for(int i=1;i<out.size();i++) {
		cout<<out[i].first<<' '<<out[i-1].second<<'\n';
		cout<<out[i].first<<' '<<out[i].second<<'\n';
	}
}
2023/10/4 13:09
加载中...