#51 Codeforces-E. Very simple problem (计算几何)(点被多少个三角形包含)

来源:互联网 发布:郁乎苍苍的苍苍 编辑:程序博客网 时间:2024/05/16 17:10

题目链接:点击打开链接

http://codeforces.com/contest/55/problem/E

题意:

给定一个凸多边形,给定一些点,问你这些点被多少个三角形包含?

题解:

平面内n点任意三点不共线可组成n*(n-1)*(n-2)/6个三角形。

求出不包含该点的三角形个数,用总个数减去这些即可。即用n*n(n-1)*(n-2)/6 - 不包含该点的三角形个数.


AC代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;struct Point{ll x,y;Point(){};Point(ll x,ll y):x(x),y(y){}};Point operator-(const Point& lhs,const Point& rhs){return Point(lhs.x-rhs.x,lhs.y-rhs.y);}ll operator*(const Point& lhs,const Point& rhs){return lhs.x*rhs.y - lhs.y*rhs.x; }ll s[1<<20];Point p[1<<20];Point q;int main(){int n,m;ll l,r,ans;for(int i=2;i<(1<<20);i++){s[i]+=s[i-1]+i-1;}cin>>n;for(int i=0;i<n;i++){cin>>p[i].x>>p[i].y;p[n+i]=p[i];}cin>>m;for(int i=0;i<m;i++){cin>>q.x>>q.y;for(int j=0;j<n;j++){if((p[j]-q)*(p[j+1]-q) >= 0){    printf("0\n");goto  NEXT;}}ans = 0;for(int j=0,k=0;j<n;j++){while((p[j]-q)*(p[k]-q)<=0){k++;}l = k-1-j;r = n-1-l;ans += s[l]+s[r];}printf("%I64d\n",1LL*n*(n-1)*(n-2)/6-ans/2);NEXT : continue;}return 0;}


1 0
原创粉丝点击