This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
import java.awt.geom.Line2D;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class fangorn {
public static double eps = 1e-9;
public static int its = 3;
public static class Obj implements Comparable<Obj>{
public double dx, dy;
public boolean g;
Obj(double a, double b, boolean c){
dx = a;
dy = b;
g = c;
}
public int compareTo(Obj o) {
return Double.compare(Math.atan2(dy, dx), Math.atan2(o.dy, o.dx));
}
}
public static int h, w;
public static boolean sect(double sx1, double sy1, double ex1, double ey1, double sx2,
double sy2, double ex2, double ey2) {
if(Line2D.linesIntersect(sx1, sy1, ex1, ey1, sx2, sy2, ex2, ey2)) {
return true;
}
if(Math.abs(sx1-sx2)<eps && Math.abs(sy1-sy2)<eps) {
return true;
}
return Math.abs(ex1-ex2)<eps && Math.abs(ey1-ey2)<eps;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
w = in.nextInt();
h = in.nextInt();
int gx = in.nextInt();
int gy = in.nextInt();
int c = in.nextInt();
boolean[] ok = new boolean[c];
Arrays.fill(ok, true);
double[][] bases = new double[c][2];
for(int i = 0; i<c; i++) {
for(int j = 0; j<2; j++) {
bases[i][j] = in.nextInt();
}
}
int n = in.nextInt();
double[][] trees = new double[n][2];
for(int i = 0; i<n; i++) {
for(int j = 0; j<2; j++) {
trees[i][j] = in.nextInt();
}
}
ArrayList<Double> sy = new ArrayList<Double>();
ArrayList<Double> sx = new ArrayList<Double>();
ArrayList<Double> ey = new ArrayList<Double>();
ArrayList<Double> ex = new ArrayList<Double>();
for(int i = 0; i<n; i++) {
ArrayList<Obj> li = new ArrayList<Obj>();
for(int j = 0; j<n; j++) {
if(i==j) {
continue;
}
li.add(new Obj(trees[i][0]-trees[j][0],trees[i][1]-trees[j][1],false));
}
li.add(new Obj(gx-trees[i][0],gy-trees[i][1],true));
Collections.sort(li);
for(int j = 0; j<li.size(); j++) {
if(!li.get(j).g) {
continue;
}
int ind = (j+li.size()-1)%li.size();
double dx = li.get(ind).dx;
double dy = li.get(ind).dy;
double len = Math.sqrt(dx*dx + dy*dy);
dx /= len;
dy /= len;
double lo = 0.0;
double hi = 1.0;
while(true) {
double nx = trees[i][0] + dx*hi;
double ny = trees[i][1] + dy*hi;
if(nx>=0 && nx<=w && ny>=0 && ny<=h) {
hi *= 2.0;
}
else {
break;
}
}
int cnt = 0;
while(hi>lo && cnt<its) {
cnt++;
double mid = (lo+hi)/2.0;
double nx = trees[i][0] + dx*mid;
double ny = trees[i][1] + dy*mid;
if(nx>=0 && nx<=w && nx>=0 && ny<=h) {
lo = mid;
}
else{
hi = mid;
}
}
sx.add(trees[i][0]);
sy.add(trees[i][1]);
ex.add(trees[i][0] + dx*lo);
ey.add(trees[i][1] + dy*lo);
ind = (j+1)%li.size();
dx = li.get(ind).dx;
dy = li.get(ind).dy;
len = Math.sqrt(dx*dx + dy*dy);
dx /= len;
dy /= len;
lo = 0.0;
hi = 1.0;
while(true) {
double nx = trees[i][0] + dx*hi;
double ny = trees[i][1] + dy*hi;
if(nx>=0 && nx<=w && ny>=0 && ny<=h) {
hi *= 2.0;
}
else {
break;
}
}
cnt = 0;
while(hi>lo && cnt<its) {
double mid = (lo+hi)/2.0;
cnt++;
double nx = trees[i][0] + dx*mid;
double ny = trees[i][1] + dy*mid;
if(nx>=0 && nx<=w && nx>=0 && ny<=h) {
lo = mid;
}
else{
hi = mid;
}
}
sx.add(trees[i][0]);
sy.add(trees[i][1]);
ex.add(trees[i][0] + dx*lo);
ey.add(trees[i][1] + dy*lo);
}
}
for(int i = 0; i<sx.size(); i++) {
for(int j = i+1; j<sx.size(); j++) {
if(!sect(sx.get(i),sy.get(i),ex.get(i),ey.get(i),sx.get(j),sy.get(j),ex.get(j),ey.get(j))) {
continue;
}
double lo = 0.0;
double hi = 1.0;
double dx = ex.get(j)-sx.get(j);
double dy = ey.get(j)-sy.get(j);
int cnt = 0;
while(hi>lo && cnt<its) {
cnt++;
double mid = (lo+hi)/2.0;
if(sect(sx.get(i),sy.get(i),ex.get(i),ey.get(i),sx.get(j),sy.get(j),sx.get(j)+dx*mid,sy.get(j)+dy*mid)) {
hi = mid;
}
else {
lo = mid;
}
}
double px = sx.get(j)+dx*lo;
double py = sy.get(j)+dy*lo;
double a1 = Math.atan2(ey.get(i)-py, ex.get(i)-px);
double a2 = Math.atan2(ey.get(j)-py, ex.get(j)-px);
if(a1>a2) {
double tmp = a1;
a1 = a2;
a2 = tmp;
}
double ag = Math.atan2(gy-py, gx-px);
for(int k = 0; k<c; k++) {
double acur = Math.atan2(bases[k][1]-py, bases[k][0]-px);
if((acur>=a1 && acur<=a2) != (ag>=a1 && ag<=a2)) {
ok[k] = false;
}
}
}
}
ArrayList<Integer> ans = new ArrayList<Integer>();
for(int i = 0; i<c; i++) {
if(ok[i]) {
ans.add(i+1);
}
}
System.out.println(ans.size());
if(ans.size()>0) {
System.out.print(ans.get(0));
for(int i = 1; i<ans.size(); i++) {
System.out.print(" " +ans.get(i));
}
System.out.println();
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |