zoukankan      html  css  js  c++  java
  • poj3907 Build Your Home

    传送门

    有向面积裸题

    所有有向三角形面积加起来就行

    Code:

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 #include<cmath>
      5 #include<queue>
      6 #include<iostream>
      7 #define ms(a,b) memset(a,b,sizeof a)
      8 #define rep(i,a,n) for(int i = a;i <= n;i++)
      9 #define per(i,n,a) for(int i = n;i >= a;i--)
     10 #define inf 2147483647
     11 using namespace std;
     12 typedef long long ll;
     13 typedef double D;
     14 #define eps 1e-8
     15 ll read() {
     16     ll as = 0,fu = 1;
     17     char c = getchar();
     18     while(c < '0' || c > '9') {
     19         if(c == '-') fu = -1;
     20         c = getchar();
     21     }
     22     while(c >= '0' && c <= '9') {
     23         as = as * 10 + c - '0';
     24         c = getchar();
     25     }
     26     return as * fu;
     27 }
     28 //head
     29 #define P point
     30 struct point {
     31     D x,y;
     32     point(){}
     33     point(D X,D Y):x(X),y(Y){}
     34     D len() {return sqrt(x*x+y*y);}
     35     D tan() {return y/x;}
     36     D sin() {return len() / y;}
     37     D cos() {return len() / x;}
     38     void print() {printf("%.2lf %.2lf
    ",x,y);}
     39     friend inline point operator + (const point &a,const point &b) {
     40         return point(a.x+b.x,a.y+b.y);
     41     }
     42     friend inline point operator - (const point &a,const point &b) {
     43         return point(a.x-b.x,a.y-b.y);
     44     }
     45     //放缩
     46     friend inline point operator * (const point &a,const D &b) {
     47         return point(a.x*b,a.y*b);
     48     }
     49     //叉积
     50     friend inline D operator * (const point &a,const point &b) {
     51         return a.x*b.y-a.y*b.x;
     52     }
     53     //点积
     54     friend inline D operator / (const point &a,const point &b) {
     55         return a.x*b.x+a.y*b.y;
     56     }
     57 };
     58 struct line {
     59     D k,b;
     60     void init(point x,point y) {
     61         k = (y.y-x.y)/(y.x-x.x);
     62         b = x.y - k * x.x;
     63     }
     64     D YY(D X) {return k*X+b;}
     65     D XX(D Y) {return (Y-b)/k;}
     66 };
     67 struct yuan {
     68     D r,x,y;
     69     yuan(){}
     70     yuan(int R,int X,int Y):r(R),x(X),y(Y){}
     71 };
     72 
     73 bool ONSEG(point a,point b,point p) {
     74     return ((a-b).len() == (a-p).len() + (p-b).len());
     75 }
     76 D TRIAREA(point a,point b,point c) {
     77     return ((a-b)*(a-c)) / 2.0;
     78 }
     79 #define ONLINE(a,b,c) (((a-b)*(a-c)) == 0)
     80 
     81 #define sign(x) (x) > 0 ? 1 : ((x) < 0 ? -1 : 0)
     82 // 1  0 -1
     83 // 锐 直 钝
     84 int ANGDIR(point a,point b,point p) {
     85     D ans = (p-a)*(p-b);
     86     return sign(ans);
     87 }
     88 
     89 D dis(point a,point b,point p) {
     90     if(ANGDIR(b,p,a) == -1) return (p-a).len();
     91     if(ANGDIR(a,p,b) == -1) return (p-b).len();
     92     return ((p-a)*(p-b)) / (a-b).len();
     93 }
     94 D dis(point a,line l) {
     95     return (l.k * a.x - a.y + l.b) / sqrt(l.k*l.k+1);
     96 }
     97 
     98 int cross(P a,P b,P c,P d) {
     99     if(ONLINE(a,b,c) ^ ONLINE(a,b,d)) return 1;
    100     if(ONLINE(c,d,a) ^ ONLINE(c,d,b)) return 1;
    101     if(ONLINE(a,b,c) & ONLINE(a,b,d)) return -1;
    102     if(ONLINE(c,d,a) & ONLINE(c,d,b)) return -1;
    103     D J1 = ((c-d)*(c-a)) * ((c-d)*(c-b));
    104     D J2 = ((a-b)*(a-c)) * ((a-b)*(a-d));
    105     if(J1 < 0 && J2 < 0) return 1;
    106     return 0;
    107 }
    108 
    109 point Cross(point a,point b,point c,point d) {
    110     if(ONLINE(a,b,c)) return c;
    111     if(ONLINE(a,b,d)) return d;
    112     if(ONLINE(c,d,a)) return a;
    113     if(ONLINE(c,d,b)) return b;
    114     D S1 = (a-c)*(a-d),S2 = (b-d) * (b-c);
    115     point tmp = (b-a) * (S1 / (S1+S2));
    116     return a + tmp;
    117 }
    118 //CP
    119 const int N = 10005;
    120 point p[N];
    121 int main() {
    122     while(1) {
    123         int n = read();
    124         if(!n) return 0;
    125         rep(i,1,n) scanf("%lf %lf",&p[i].x,&p[i].y);
    126         D res = 0.0;
    127         rep(i,1,n) (i ^ n) ? res += p[i] * p[i+1] : res += p[n] * p[1];
    128         printf("%.0lf
    ",fabs(res) / 2.0);
    129     }
    130 }
  • 相关阅读:
    dotNet开发游戏微端
    另类Unity热更新大法:代码注入式补丁热更新
    KSFramework配置表:扩展表格解析类型
    KSFramework常见问题:Excel如何进行SVN协作、差异比较?
    KSFramework常见问题:Lua脚本热重载,内存状态数据丢失?
    KEngine:Unity3D资源的打包、加载、调试监控
    KEngine策划指南:配置表格的编辑与编译
    开发遇到的奇葩问题
    初始加载时edittext不自动获取焦点的方法
    android 监控软键盘确定 搜索 按钮并赋予点击事件
  • 原文地址:https://www.cnblogs.com/yuyanjiaB/p/9996440.html
Copyright © 2011-2022 走看看