Little Sub and Triangles(叉积+二分查找)

题目: Little Sub and Triangles

题意:Refusing
Refusing
数据:
4 2
0 1
100 100
0 0
1 0
0 50
0 2
思想:因为最多只用250个点,通过O(N^3)把所有的三角形面积求出来,通过二分查找,找到答案。
叉积公式:S=abs(x1y2+x2y3+x3y1-x1y3-x2y1-x3y2) /2;
代码:

#include<bits/stdc++.h>
using namespace std;
const int num = 255;
#define LL long long
struct Node
{
    LL x, y;
} a[num];

vector<LL>v;
int main()
{
    int n, q;
    scanf("%d %d", &n, &q);
    for(int i = 0; i < n; i++)
    {
        scanf("%lld %lld", &a[i].x, &a[i].y);
    }
    v.clear();
    for(int i = 0; i < n-2; i++)
    {
        for(int j = i+1; j < n-1; j++)
        {
            for(int k = j+1; k < n; k++)
            {
                LL ans = abs(a[i].x*a[j].y + a[j].x*a[k].y+a[k].x*a[i].y-a[i].x*a[k].y-a[j].x*a[i].y-a[k].x*a[j].y);//叉积
                v.push_back(ans);
            }
        }
    }
    sort(v.begin(), v.end());
    LL l, r;
    for(int i = 1; i <= q; i++)
    {
        scanf("%lld %lld", &l, &r);
        LL pos = upper_bound(v.begin(), v.end(), r*2) - lower_bound(v.begin(), v.end(), l*2);//二分查找,因为上面的结果没有除以2,所以l,r乘以2
        printf("%lld\n", pos);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值