Codeforces Peter and Snow Blower Solution in Java

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class Peterandsnowblower {

 public static void main(String[] args) 
 {
  MyScannerpeter sc=new MyScannerpeter();
  int n=sc.nextInt();
  double x=sc.nextInt();
  double y=sc.nextInt();
  Point p=new Point(x,y);
  Point pt[]=new Point[n];
  int i;
  double R=0;
  double r=Double.MAX_VALUE;
  for(i=0;i<n;i++)
  {
   double s=sc.nextDouble();
   double t=sc.nextDouble();
   pt[i]=new Point(s,t);
  }
  for(i=0;i<n;i++)
  {
   R=Math.max(R, pt[i].distance(p));
   int next=(i==n-1)?0:i+1;
   r=Math.min(r,pt[i].shortd(pt[next],p));
  }
  double area=Math.PI*(R*R-r*r);
  System.out.println(area);

 }
 static class Point
 {
  double x;
  double y;
  Point(double x,double y)
  {
   this.x=x;
   this.y=y;
  }
  double distance(Point p)
  {
   double a=x-p.x;
   double b=y-p.y;
   return Math.sqrt(a*a+b*b);
  }
  Point diff(Point p)
  {
   return new Point(p.x-x,p.y-y);
  }
  double dot(Point p)
  {
   return x*p.x+y*p.y;
  }
  double cross(Point p)
  {
   return (x*p.y-y*p.x);
  }
  double shortd(Point next,Point p)
  {
   Point d=this.diff(next);
   Point e=this.diff(p);
   if(e.dot(d)<0){
    
    return this.distance(p);
   }
    
   else if(next.diff(p).dot(d.multi())<0){
    
    return next.distance(p);
   }
   else
   {
    
    return Math.abs(e.cross(d))/d.mag();
   }
    
   
  }
  double mag()
  {
   return Math.sqrt(x*x+y*y);
  }
  Point multi()
  {
   return new Point(-x,-y);
   
  }
 }
}
class MyScannerpeter
{
 BufferedReader br;
 StringTokenizer st;
 MyScannerpeter()
 {
  br=new BufferedReader(new InputStreamReader(System.in));
 }
 String next()
 {
  
  while(st==null || !st.hasMoreTokens())
  {
   try
   {
    st=new StringTokenizer(br.readLine());
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
  }
  return st.nextToken();
  
 }
 int nextInt()
 {
  return Integer.parseInt(next());
 }
 long nextLong()
 {
  return Long.parseLong(next());
 }
 double nextDouble()
 {
  return Double.parseDouble(next());
 }
 String nextLine()
 {
  String str="";
  try
  {
   str=br.readLine();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  return str;
  
 }
}

Comments

Popular Posts