D - Area
Time Limit:1000MS
Memory Limit:10000KB
64bit IO Format:%I64d & %I64u Submit Status
Description
Being well known for its highly innovative products, Merck would definitely be a good target for industrial espionage. To protect its brand-new research and development facility the company has installed the latest system of surveillance robots patrolling the area. These robots move along the walls of the facility and report suspicious observations to the central security office. The only flaw in the system a competitor? agent could find is the fact that the robots radio their movements unencrypted. Not being able to find out more, the agent wants to use that information to calculate the exact size of the area occupied by the new facility. It is public knowledge that all the corners of the building are situated on a rectangular grid and that only straight walls are used. Figure 1 shows the course of a robot around an example area.
Figure 1: Example area.
You are hired to write a program that calculates the area occupied by the new facility from the movements of a robot along its walls. You can assume that this area is a polygon with cZ??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcm5lcnMgb24gYSByZWN0YW5ndWxhciBncmlkLiBIb3dldmVyLCB5b3VyIGJvc3MgaW5zaXN0cyB0aGF0IHlvdSB1c2UgYSBmb3JtdWxhCiBoZSBpcyBzbyBwcm91ZCB0byBoYXZlIGZvdW5kIHNvbWV3aGVyZS4gVGhlIGZvcm11bGEgcmVsYXRlcyB0aGUgbnVtYmVyIEkgb2YgZ3JpZCBwb2ludHMgaW5zaWRlIHRoZSBwb2x5Z29uLCB0aGUgbnVtYmVyIEUgb2YgZ3JpZCBwb2ludHMgb24gdGhlIGVkZ2VzLCBhbmQgdGhlIHRvdGFsIGFyZWEgQSBvZiB0aGUgcG9seWdvbi4gVW5mb3J0dW5hdGVseSwgeW91IGhhdmUgbG9zdCB0aGUgc2hlZXQgb24gd2hpY2ggaGUgaGFkIHdyaXR0ZW4gZG93biB0aGF0CiBzaW1wbGUgZm9ybXVsYSBmb3IgeW91LCBzbyB5b3VyIGZpcnN0IHRhc2sgaXMgdG8gZmluZCB0aGUgZm9ybXVsYSB5b3Vyc2VsZi4gPGJyPgoKCgoKPHAgY2xhc3M9"pst"> Input
The first line contains the number of scenarios.
For each scenario, you are given the number m, 3 <= m < 100, of movements of the robot in the first line. The following m lines contain pairs ?x dy?of integers, separated by a single blank, satisfying .-100 <= dx, dy <= 100 and (dx, dy) != (0, 0). Such a pair means that the robot moves on to a grid point dx units to the right and dy units upwards on the grid (with respect to the current position). You can assume that the curve along which the robot moves is closed and that it does not intersect or even touch itself except for the start and end points. The robot moves anti-clockwise around the building, so the area to be calculated lies to the left of the curve. It is known in advance that the whole polygon would fit into a square on the grid with a side length of 100 units.
Output
The output for every scenario begins with a line containing ?cenario #i:? where i is the number of the scenario starting at 1. Then print a single line containing I, E, and A, the area A rounded to one digit after the decimal point. Separate the three numbers by two single blanks. Terminate the output for the scenario with a blank line.
Sample Input
2
4
1 0
0 1
-1 0
0 -1
7
5 0
1 3
-2 2
-1 0
0 -3
-3 1
0 -3
Sample Output
Scenario #1:
0 4 1.0
Scenario #2:
12 16 19.0
这题有点……刚开始直接用了多边形的模板,然后得不到样例的答案,有点神了……而且我是照着计算几何PDF上的代码敲的,竟然不对,我还在想是不是坑我呢这代码……
没出样例的原因是没看好题目,题目给的是机器人移动的方位,而不是刚开始就给出坐标,所以它的坐标就是移动方位的累加咯,走到哪当然就是坐标咯。
#include
#include
#include
#include
#include
#define MAX 111116 #define eps 1e-7 using namespace std; int sgn(const double &x){ return x < -eps? -1 : (x > eps);} inline double sqr(const double &x){ return x * x;} inline int gcd(int a, int b){ return !b? a: gcd(b, a % b);} struct Point { double x, y; Point(){} Point(const double &x, const double &y):x(x), y(y){} Point operator -(const Point &a)const{ return Point(x - a.x, y - a.y); } Point operator +(const Point &a)const{ return Point(x + a.x, y + a.y); } Point operator * (const double &a)const{ return Point(x * a, y * a); } Point operator / (const double &a)const{ return Point(x / a, y / a); } friend double det(const Point &a, const Point &b){ return a.x * b.y - a.y * b.x;} friend double dot(const Point &a, const Point &b){ return a.x * b.x + a.y * b.y;} friend double dist(const Point &a, const Point &b){ return sqrt(sqr(a.x - b.x) + sqr(a.y