Submission #291193

#TimeUsernameProblemLanguageResultExecution timeMemory
291193TadijaSebezRoads (CEOI20_roads)C++11
100 / 100
206 ms13016 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ldb long double
#define pb push_back
#define mp make_pair
struct pt{ll x,y;pt(ll a=0,ll b=0):x(a),y(b){}};
bool operator < (pt a,pt b){return mp(a.x,a.y)<mp(b.x,b.y);}
const int N=100050;
const int lim=1e8;
pt a[N][2];
ll tme;
ldb sec(int i){
	if(tme==a[i][0].x)return a[i][0].y;
	ldb k=(ldb)(a[i][1].y-a[i][0].y)/(a[i][1].x-a[i][0].x);
	ldb n=a[i][0].y-a[i][0].x*k;
	return tme*k+n;
}
struct seg{
	int idx;
	mutable pt rig;
	seg(){}
	seg(int i):idx(i){}
};
bool operator < (seg a,seg b){
	return sec(a.idx)<sec(b.idx);
}
set<seg> all;
int main(){
	int n;
	scanf("%i",&n);
	vector<pair<pt,int>> evs;
	for(int i=1;i<=n;i++){
		scanf("%lld %lld %lld %lld",&a[i][0].x,&a[i][0].y,&a[i][1].x,&a[i][1].y);
		if(a[i][1]<a[i][0])swap(a[i][0],a[i][1]);
		evs.pb({a[i][0],i});
		evs.pb({a[i][1],-i});
	}
	a[n+1][0]=pt(-lim,-lim);
	a[n+1][1]=pt(lim,-lim);
	a[n+2][0]=pt(-lim,lim);
	a[n+2][1]=pt(lim,lim);
	tme=-lim;
	all.insert(seg(n+1));
	all.begin()->rig=pt(-lim,-lim);
	all.insert(seg(n+2));
	sort(evs.begin(),evs.end());
	for(auto e:evs){
		pt p=e.first;
		int i=abs(e.second);
		tme=p.x;
		if(e.second>0){
			all.insert(seg(i));
			auto it=all.find((seg(i)));
			it->rig=p;
			pt now=prev(it)->rig;
			prev(it)->rig=p;
			if(now.x!=-lim)printf("%lld %lld %lld %lld\n",now.x,now.y,p.x,p.y);
		}else{
			auto it=all.find(seg(i));
			prev(it)->rig=p;
			all.erase(it);
		}
	}
	return 0;
}

Compilation message (stderr)

roads.cpp: In function 'int main()':
roads.cpp:31:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   31 |  scanf("%i",&n);
      |  ~~~~~^~~~~~~~~
roads.cpp:34:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   34 |   scanf("%lld %lld %lld %lld",&a[i][0].x,&a[i][0].y,&a[i][1].x,&a[i][1].y);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...