■1202 Mobile Phone Coverage
面倒な問題.下の画像のような感じに分割した.区間をマージする処理が面倒だった.
- import java.util.*;
- import java.lang.*;
- import java.math.*;
- import java.io.*;
- import static java.lang.Math.*;
- import static java.util.Arrays.*;
- public class Main{
- Scanner sc=new Scanner(System.in);
- int INF=1<<28;
- double EPS=1e-9;
- int n;
- R[] rs;
- int caze;
- void run(){
- for(caze=1;; caze++){
- n=sc.nextInt();
- if(n==0){
- break;
- }
- rs=new R[n];
- for(int i=0; i<n; i++){
- double x=sc.nextDouble();
- double y=sc.nextDouble();
- double r=sc.nextDouble();
- rs[i]=new R(x-r, y-r, x+r, y+r);
- }
- solve();
- }
- }
- void solve(){
- TreeSet<Double> setX=new TreeSet<Double>();
- for(int i=0; i<n; i++){
- setX.add(rs[i].x1);
- setX.add(rs[i].x2);
- }
- Double[] xs=setX.toArray(new Double[0]);
- sort(xs);
- int m=xs.length;
- @SuppressWarnings("unchecked")
- TreeSet<R>[] setR=new TreeSet[m];
- for(int i=0; i<m; i++){
- setR[i]=new TreeSet<R>();
- }
- for(int j=0; j<m-1; j++){
- for(int i=0; i<n; i++){
- if(rs[i].x1<xs[j]+EPS&&xs[j]+EPS<rs[i].x2){
- setR[j].add(rs[i]);
- }
- }
- }
- double sum=0;
- for(int k=0; k<m-1; k++){
- LinkedList<Double> seg=new LinkedList<Double>();
- for(R r : setR[k]){
- if(abs(r.y1-r.y2)<EPS){
- continue;
- }
- int i=seg.size(), j=seg.size();
- for(int p=seg.size()-1; p>=0; p--){
- double y=seg.get(p);
- if(y+EPS>r.y2){
- j=p;
- }
- if(y+EPS>r.y1){
- i=p;
- }
- }
- for(int p=i; p<j; p++){
- seg.remove(i);
- }
- if(j%2==0){
- seg.add(i, r.y2);
- }
- if(i%2==0){
- seg.add(i, r.y1);
- }
- }
- double len=0;
- for(int i=0; i<seg.size(); i+=2){
- len+=seg.get(i+1)-seg.get(i);
- }
- sum+=len*(xs[k+1]-xs[k]);
- }
- println(String.format("%d %.2f", caze, sum+EPS));
- }
- class R implements Comparable<R>{
- double x1, y1, x2, y2;
- R(double x1, double y1, double x2, double y2){
- this.x1=x1;
- this.y1=y1;
- this.x2=x2;
- this.y2=y2;
- }
- @Override
- public int compareTo(R arg0){
- if(y1-y2+EPS<0){
- return -1;
- }else if(y1-y2>0+EPS){
- return 1;
- }else if(x1-x2+EPS<0){
- return -1;
- }else if(x1-x2>0+EPS){
- return 1;
- }else{
- return 0;
- }
- }
- }
- void debug(Object... os){
- // System.err.println(Arrays.deepToString(os));
- }
- void print(String s){
- System.out.print(s);
- }
- void println(String s){
- System.out.println(s);
- }
- public static void main(String[] args){
- // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
- new Main().run();
- }
- }
0 件のコメント:
コメントを投稿