답안 #448632

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
448632 2021-07-31T09:51:19 Z vanic The Forest of Fangorn (CEOI14_fangorn) C++14
10 / 100
383 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;
	sol1=-c/b;
	sol2=-c/a;
	sol3=(-c-a*w)/b;
	sol4=(-c-b*h)/a;
	if(b==0){
		sol1=-1e18;
		sol3=1e18;
	}
	if(a==0){
		sol2=-1e18;
		sol4=1e18;
	}
//	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 460 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 512 KB Output is correct
6 Incorrect 1 ms 460 KB Output isn't correct
7 Correct 2 ms 792 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 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 1460 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 3 ms 716 KB Output is correct
10 Correct 13 ms 2380 KB Output is correct
11 Correct 15 ms 2560 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 1 ms 516 KB Output is correct
3 Correct 1 ms 516 KB Output is correct
4 Correct 383 ms 45496 KB Output is correct
5 Correct 86 ms 11460 KB Output is correct
6 Runtime error 129 ms 65540 KB Execution killed with signal 9
# 결과 실행 시간 메모리 Grader output
1 Runtime error 118 ms 65540 KB Execution killed with signal 9
2 Halted 0 ms 0 KB -