| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
1A#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;
const double PI = 3.1415926535;
int ABS(int a){
if(a < 0) return -a;
return a;
}
int GCD(int a, int b){
a = ABS(a), b = ABS(b);
if(a == 0) return b;
if(b == 0) return a;
if(a >= b) return GCD(a%b, b);
return GCD(b%a, a);
}
struct pt{
int x,y;
pt *prev, *next;
}pts[233];
double mianji(pt &p1, pt &p2, pt &p3){
return abs(0.5 * (p1.x*p2.y+p2.x*p3.y+p3.x*p1.y-p1.y*p2.x-p2.y*p3.x-p3.y*p1.x));
}
double angle(pt &p1, pt &p2){
double a = atan2(p2.y-p1.y+0.0, p2.x-p1.x+0.0);
if(a >= 0) return a;
return a + 2*PI;
}
double angle(pt &p1, pt &p2, pt &p3){
double a1 = angle(p2, p1), a2 = angle(p2, p3);
if(a1 - a2 >= 0) return a1-a2;
return a1 - a2 + 2*PI;
}
int sign(pt &p1, pt &p2, pt &p3){
int get = p1.x*p2.y + p2.x*p3.y + p3.x*p1.y - p1.y*p2.x - p2.y*p3.x - p3.y*p1.x;
if(get > 0) return 1;
else if(get < 0)return -1;
else return 0;
}
bool neimian(pt &nd, pt &p1, pt &p2, pt &p3){
int sign1 = sign(nd, p1, p2), sign2 = sign(nd, p2, p3), sign3 = sign(nd, p3, p1);
bool z = 0, f = 0;
if(sign1 == 1) z = 1;
if(sign1 == -1) f = 1;
if(sign2 == 1) z = 1;
if(sign2 == -1) f = 1;
if(sign3 == 1) z = 1;
if(sign3 == -1) f = 1;
return !(z && f);
}
int main() {
int T;
scanf("%d", &T);
for(int ii = 1; ii <= T; ii++){
printf("Scenario #%d:\n", ii);
int num;
scanf("%d", &num);
//int x[233], y[233];
//x[0] = y[0] = 0;
int bj = num;
int curX = 0, curY = 0;
for(int i = 0; i < num; i++){
//x[i] = curX, y[i] = curY;
pts[i].x = curX, pts[i].y = curY;
pts[i].next = &pts[(i+1)%num], pts[i].prev = &pts[(i+num-1)%num];
int tmpX, tmpY;
scanf("%d%d", &tmpX, &tmpY);
bj += GCD(tmpX, tmpY)-1;
curX += tmpX, curY += tmpY;
}
double yjddmj = 0.0;
pt *curP = &pts[0];
int sygs = num;
while(1){
//cout << sygs << endl;
int cnt = 0;
while(1){
//cout << cnt << endl;
if(angle(*(curP->prev), *curP, *(curP->next)) > PI-1e-8){
bool ky = 1;
pt *temp = curP->next->next;
while(temp != curP->prev){
//cout << (temp - pts) << endl;
if(neimian(*temp, *(curP->prev), *(curP), *(curP->next))){
ky = 0;
break;
}
temp = temp->next;
}
if(ky) break;
}
cnt ++;
curP = curP->next;
if(cnt > sygs) goto done;
}
yjddmj += mianji(*(curP->prev), *curP, *(curP->next));
sygs --;
curP->next->prev = curP->prev;
curP->prev->next = curP->next;
curP = curP->next;
}
done:
double mj = 0;
pt *curPP = curP->next;
while(curPP->next != curP){
//cout << 1 << endl;
mj += mianji(*curP, *curPP, *(curPP->next));
curPP = curPP->next;
}
mj -= yjddmj;
int nd = (int)(mj + 1 - 0.5 * bj);
printf("%d %d %.1lf\n\n", nd, bj, mj);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator