列表

详情


NC221050. Ssyze'sGeometry

描述

在经过一番学习以后,Ssyze 总算对几何略知一二,所以他想考考你。

在极坐标系下,对于一个以极点为圆心,周长为 l的圆 ,我们可以沿着它的圆周建立一条数轴,使在圆上的每个点 都可以用一个实数 x ()唯一表示。

现在, Ssyze 在圆上选出了 n 个不同的点,其中第 i 个点的坐标为 x_i。他想知道,从这 n 个点中任选三个点作为顶点所构成所有三角形中,有多少个包含圆心(在内部或者在边上)?

两个三角形不同,当且仅当他们至少有一个不同的顶点。

输入描述

第一行有两个整数   ,分别表示圆上点的个数和圆的周长。

第二行有  个不同的整数 ,分别表示 n 个点沿着周长的坐标。

输出描述

输出一个整数,表示满足要求的三角形的个数。

示例1

输入:

4 100
0 30 50 80

输出:

4

示例2

输入:

8 100
92 1 12 34 45 51 84 88

输出:

25

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 252ms, 内存消耗: 17864K, 提交时间: 2021-04-20 14:17:47

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6*2+10;
typedef long long ll;
int n,l;
ll ans;
int d[maxn];
int main(){
    cin>>n>>l;
    for(int i=1;i<=n;i++)scanf("%d",&d[i]);
    sort(d+1,d+1+n);
    for(int i=1;i<=n;i++)d[i+n]=d[i]+l;
    for(int i=1,j=1;i<=n;i++){
        while(j<2*n&&(d[j]- d[i])*2<l)j++;
        ll an=(j-i-1);
        ans+=(an-1)*an/2;
    }
    ll tot=1ll*n*(n-1)*(n-2)/6;
    cout<<tot-ans<<endl;
}

上一题