답안 #448639

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
448639 2021-07-31T10:14:53 Z vanic The Forest of Fangorn (CEOI14_fangorn) C++14
10 / 100
385 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;
const double inf=2e18;

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=-inf;
		sol3=inf;
	}
	else{
		sol1=-c/b;
		sol3=(-c-a*w)/b;
	}
	if(a==0){
		sol2=-inf;
		sol4=inf;
	}
	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].size()>1){
		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 460 KB Output is correct
3 Incorrect 1 ms 516 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 812 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 1 ms 588 KB Output is correct
3 Correct 3 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 13 ms 2396 KB Output is correct
11 Correct 14 ms 2552 KB Output is correct
12 Correct 15 ms 2508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 460 KB Output is correct
2 Correct 2 ms 588 KB Output is correct
3 Correct 1 ms 588 KB Output is correct
4 Correct 385 ms 45468 KB Output is correct
5 Correct 85 ms 11460 KB Output is correct
6 Runtime error 112 ms 65540 KB Execution killed with signal 9
# 결과 실행 시간 메모리 Grader output
1 Runtime error 112 ms 65540 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -