码迷,mamicode.com
首页 > 其他好文 > 详细

CF13D Triangles

时间:2019-09-07 22:27:39      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:想法   get   范围   ios   个数   ons   组成   ==   printf   

这是一道需要数学知识的\(DP?\)

Idea

首先,如何判断一个点是否在该三角形内 —— 我们假定\(\bigtriangleup ABC\)以及所要判断的点\(P\),如果\(P\)\(ABC\)内,那么对边\(AB\)来说,点\(P\)和点\(C\)在边\(AB\)的同侧;对边\(BC\)来说,点\(P\)和点\(A\)在边BC的同侧,同样,边\(AC\)也是如此。我们可以用叉积来实现这个想法,叉积\(>0\)为同侧,叉积\(<0\)为异侧。

我们设一个原点\(O\)(其坐标应在输入范围以外),每次在红点中找两个点,求这两个点与\(O\)组成的三角形中有多少个蓝点,用\(dp[i][j]\)保存下来;

我们假设在红点中选三个点组成三角形,标记为\(ABC\),那么

\(\bigtriangleup ABC\text{内蓝点个数} = \bigtriangleup OAB + \bigtriangleup OBC - \bigtriangleup OAC\)

Code

记得开\(long~long\),否则连样例都过不去

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<queue>
#define int long long
#define maxn 505
#define inf 2147483647
#define mod 998244353
#define eps 1e-6
#define pi acos(-1.0)
#define de(x) ((x)*(x))
using namespace std; 
inline int read(){
    int x=0,f=1; char ch=getchar();
    while(!isdigit(ch)) {if(ch=='-')f=-1;ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-48;ch=getchar();}
    return x*f;
}
int dp[maxn][maxn];
struct Node{
    int x, y;
    Node() {}
    Node(int xi, int yi):x(xi), y(yi){}
    Node operator - (const Node &N) const{return Node(x-N.x, y-N.y);}
    inline int operator * (const Node &N) const{return x*N.y-y*N.x;}
}red[maxn],blue[maxn];
signed main(){
    int n=read(),m=read();
    for(int i=0;i<n;i++) red[i].x=read(),red[i].y=read();
    for(int i=0;i<m;i++) blue[i].x=read(),blue[i].y=read();
    Node a=Node(-1000000001,-1000000001);
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++){
        if((red[i]-a)*(red[j]-a)<=0) continue;
        for(int k=0;k<m;k++){
            if((red[i]-a)*(blue[k]-a)>0&&(red[j]-red[i])*(blue[k]-red[i])>0&&(a-red[j])*(blue[k]-red[j])>0)
                dp[i][j]++;
        }
        dp[j][i]=-dp[i][j];
    }
    int ans=0;
    for(int i=0;i<n;i++)
    for(int j=i+1;j<n;j++)
    for(int k=j+1;k<n;k++)
    ans+=(dp[i][j]+dp[j][k]+dp[k][i]==0);
    printf("%d",ans);
    return 0;
}

CF13D Triangles

标签:想法   get   范围   ios   个数   ons   组成   ==   printf   

原文地址:https://www.cnblogs.com/cbyyc/p/11483246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!