POJ1151矩形面积并

来源:互联网 发布:淘宝好评返现举报入口 编辑:程序博客网 时间:2024/06/09 23:46

题意: n个矩形面积并。

import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.PrintWriter;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Scanner;import java.util.Set;import java.util.TreeSet;public class Main {public static void main(String[] args) {new POJ1151().run();}}class POJ1151 {void run() {Scanner cin = new Scanner(new BufferedInputStream(System.in));PrintWriter cout = new PrintWriter(new BufferedOutputStream(System.out));int Case = 0;int n;while ((n = cin.nextInt()) != 0) {Line[] lines = new Line[2 * n];List<Double> xs = new ArrayList<Double>();for (int i = 0; i < n; i++) {double x1 = cin.nextDouble(), y1 = cin.nextDouble();double x2 = cin.nextDouble(), y2 = cin.nextDouble();lines[i * 2] = new Line(x1, x2, y1, 1);lines[i * 2 + 1] = new Line(x1, x2, y2, -1);xs.add(x1);xs.add(x2);}h = new Hash(xs);int limit = h.length() - 1;build(1, 0, limit);double res = 0;Arrays.sort(lines);for (int i = 0; i < 2 * n - 1; i++) {int l = h.idx(lines[i].left_x);int r = h.idx(lines[i].right_x) - 1;update(l, r, lines[i].f, 1, 0, limit);res += len[1] * (lines[i + 1].y - lines[i].y);}if(Case != 0) cout.println();cout.printf("Test case #%d\n", ++Case);cout.printf("Total explored area: %.2f\n", res);}cout.flush();}void build(int t, int l, int r) {left[t] = l;right[t] = r;len[t] = 0;cnt[t] = 0;if (l == r)return;int mid = (l + r) >> 1;build(t << 1, l, mid);build(t << 1 | 1, mid + 1, r);}void up(int t) {if (cnt[t] != 0)len[t] = h.value(right[t] + 1) - h.value(left[t]);else if (left[t] == right[t])len[t] = 0;elselen[t] = len[t << 1] + len[t << 1 | 1];}void update(int al, int ar, int c, int t, int l, int r) {if (al <= l && r <= ar) {cnt[t] += c;up(t);return;}int mid = (l + r) >> 1;if (al <= mid)update(al, ar, c, t << 1, l, mid);if (ar > mid)update(al, ar, c, t << 1 | 1, mid + 1, r);up(t);}Hash h;final int N = 208;int[] left = new int[N << 2];int[] right = new int[N << 2];int[] cnt = new int[N << 2];double[] len = new double[N << 2];}class Line implements Comparable<Line> {double left_x;double right_x;double y;int f;Line(double left_x, double right_x, double y, int f) {this.left_x = left_x;this.right_x = right_x;this.y = y;this.f = f;}@Overridepublic int compareTo(Line other) {return Double.compare(y, other.y);}}class Hash {Hash(List<Double> array) {Set<Double> treeSet = new TreeSet<Double>();for (double d : array)treeSet.add(d);this.array = new double[treeSet.size()];size = 0;for (double d : treeSet)this.array[size++] = d;}int length() {return size;}int idx(double key) {return Arrays.binarySearch(array, key);}double value(int idx) {return array[idx];}int size;double[] array;}


0 0
原创粉丝点击