답안 #448633

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
448633 2021-07-31T09:54:11 Z vanic The Forest of Fangorn (CEOI14_fangorn) C++14
10 / 100
384 ms 65540 KB
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;
#define double long double

const int maxn=2005, maxm=1e4+5;


pair < int, int > d[maxn];
pair < int, int > q[maxm];

vector < double > kor[maxn][4]; // jednadzbe: x=0, y=0, x=w, y=h
vector < pair < double, int > > sw[4];
vector < int > sol;
pair < int, int > pos;
int w, h;

void radi(int x, int y){
	double a, b, c;
	int dx, dy;
	dx=d[x].first-d[y].first;
	dy=d[x].second-d[y].second;
	a=-dy;
	b=dx;
	c=-a*d[x].first-b*d[x].second;
	double sol1, sol2, sol3, sol4;
	if(b==0){
		sol1=-1e30;
		sol3=1e30;
	}
	else{
		sol1=-c/b;
		sol3=(-c-a*w)/b;
	}
	if(a==0){
		sol2=-1e30;
		sol4=1e30;
	}
	else{
		sol2=-c/a;
		sol4=(-c-b*h)/a;
	}
//	cout << sol1 << ' ' << sol2 << ' ' << sol3 << ' ' << sol4 << endl;
	if(b==0){
		if(d[x].second<d[y].second){
			kor[x][0].push_back(sol1);
			kor[y][2].push_back(sol3);
			kor[x][2].push_back(sol1);
			kor[y][0].push_back(sol3);
		}
		else{
			kor[x][0].push_back(sol3);
			kor[y][2].push_back(sol1);
			kor[x][2].push_back(sol3);
			kor[y][0].push_back(sol1);
		}
	}
	else if(d[x].first<d[y].first){
		kor[x][0].push_back(sol1);
		kor[y][2].push_back(sol3);
	}
	else{
		kor[x][2].push_back(sol3);
		kor[y][0].push_back(sol1);
	}
	if(a==0){
		if(d[x].first<d[y].first){
			kor[x][1].push_back(sol2);
			kor[y][3].push_back(sol4);
			kor[x][3].push_back(sol2);
			kor[y][1].push_back(sol4);
		}
		else{
			kor[x][1].push_back(sol4);
			kor[y][3].push_back(sol2);
			kor[x][3].push_back(sol4);
			kor[y][1].push_back(sol2);
		}
	}
	else if(d[x].second<d[y].second){
		kor[x][1].push_back(sol2);
		kor[y][3].push_back(sol4);
	}
	else{
		kor[x][3].push_back(sol4);
		kor[y][1].push_back(sol2);
	}
}

double ccw(pair < double, double > a, pair < double, double > b, pair < double, double > c){
	return a.first*(b.second-c.second)+b.first*(c.second-a.second)+c.first*(a.second-b.second);
}

bool provjeri(pair < double, double > a, pair < double, double > b, pair < double, double > c, pair < double, double > x){
	if(ccw(a, b, c)<0){
		swap(b, c);
	}
	return ccw(a, b, x)>0 && ccw(b, c, x)>0 && ccw(c, a, x)>0;
}

void rijesi(int x, int y){
	sort(kor[x][y].begin(), kor[x][y].end());
	pair < double, double > t1, t2;
	if(y==0){
		t1.first=0;
		t2.first=0;
	}
	else if(y==1){
		t1.second=0;
		t2.second=0;
	}
	else if(y==2){
		t1.first=w;
		t2.first=w;
	}
	else{
		t1.second=h;
		t2.second=h;
	}
	int ind=-1;
	for(int i=0; i<(int)kor[x][y].size()-1; i++){
		if(y==0){
			t1.second=kor[x][y][i];
			t2.second=kor[x][y][i+1];
		}
		else if(y==1){
			t1.first=kor[x][y][i];
			t2.first=kor[x][y][i+1];
		}
		else if(y==2){
			t1.second=kor[x][y][i];
			t2.second=kor[x][y][i+1];
		}
		else{
			t1.first=kor[x][y][i];
			t2.first=kor[x][y][i+1];
		}
		if(provjeri(t1, t2, d[x], pos)){
			ind=i;
			break;
		}
	}
	if(!kor[x][y].empty()){
		sw[y].push_back({kor[x][y][0], 1});
		sw[y].push_back({kor[x][y].back(), -1});
		if(ind!=-1){
			sw[y].push_back({kor[x][y][ind], -1});
			sw[y].push_back({kor[x][y][ind+1], 1});
		}
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> w >> h;
	cin >> pos.first >> pos.second;
	int n,m;
	cin >> m;
	for(int i=0; i<m; i++){
		cin >> q[i].first >> q[i].second;
	}
	cin >> n;
	for(int i=0; i<n; i++){
		cin >> d[i].first >> d[i].second;
	}
	for(int i=0; i<n; i++){
		for(int j=i+1; j<n; j++){
			radi(i, j);
		}
	}
	for(int i=0; i<n; i++){
		for(int j=0; j<4; j++){
			rijesi(i, j);
		}
	}
	for(int i=0; i<m; i++){
		if(q[i].first==0){
			sw[0].push_back({q[i].second, i+2});
		}
		else if(q[i].second==0){
			sw[1].push_back({q[i].first, i+2});
		}
		else if(q[i].first==w){
			sw[2].push_back({q[i].second, i+2});
		}
		else{
			sw[3].push_back({q[i].first, i+2});
		}
	}
	int val;
	for(int i=0; i<4; i++){
		sort(sw[i].begin(), sw[i].end());
		val=0;
		for(int j=0; j<(int)sw[i].size(); j++){
			if(sw[i][j].second<2){
				val+=sw[i][j].second;
			}
			else{
				if(val){
					continue;
				}
				sol.push_back(sw[i][j].second-1);
			}
		}
	}
	cout << sol.size() << '\n';
	sort(sol.begin(), sol.end());
	for(int i=0; i<(int)sol.size(); i++){
		cout << sol[i] << ' ';
	}
	cout << '\n';
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 1 ms 508 KB Output is correct
3 Incorrect 1 ms 460 KB Output isn't correct
4 Correct 1 ms 460 KB Output is correct
5 Correct 1 ms 460 KB Output is correct
6 Incorrect 1 ms 460 KB Output isn't correct
7 Correct 2 ms 716 KB Output is correct
8 Correct 2 ms 716 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 588 KB Output isn't correct
2 Correct 2 ms 588 KB Output is correct
3 Correct 2 ms 716 KB Output is correct
4 Incorrect 3 ms 844 KB Output isn't correct
5 Incorrect 3 ms 844 KB Output isn't correct
6 Incorrect 7 ms 1484 KB Output isn't correct
7 Correct 1 ms 460 KB Output is correct
8 Correct 1 ms 460 KB Output is correct
9 Correct 2 ms 716 KB Output is correct
10 Correct 17 ms 2380 KB Output is correct
11 Correct 16 ms 2508 KB Output is correct
12 Correct 16 ms 2608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 1 ms 588 KB Output is correct
3 Correct 1 ms 588 KB Output is correct
4 Correct 384 ms 45488 KB Output is correct
5 Correct 90 ms 11508 KB Output is correct
6 Runtime error 130 ms 65540 KB Execution killed with signal 9
# 결과 실행 시간 메모리 Grader output
1 Runtime error 114 ms 65540 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -