RQNOJ 698(矩形计数-圆内接矩形数)

内容目录

查看题目 Show Problem

题目:矩形计数

问题编号:698

题目描述

给出圆周上的N个点,请你计算出以这些点中的任意四个为四个角,能构成多少个矩形。
点的坐标是这样描述的,给定一个数组v[1..N],假设圆心为(0,0),圆的周长C=∑v[1..N] ,第一个点坐标为(0,C/(2π))。从第一个点开始,顺时针沿圆周走v1个单位长度,此时坐标为第二个点的坐标,再走v2个单位长度,此时为第三个点的坐标,当走完v1,v2..vi个距离后,为第i+1个点的坐标(全过程都是沿圆周顺时针)。特别的,走完v1,v2..vn个距离后,就会回到第一个点。

对于100%的数据,有N<=20,V数组中的所有元素的值<=100。

输入格式

输入共N+1行。
第一行为正整数N。
接下来N行每行一个正整数。其中第i+1行表示的是v[i]。

输出格式

输出共1行,一个整数,表示能构成的矩形的个数。

样例输入

8
1
2
2
3
1
1
3
3

样例输出

3

//样例解释[img]http://www.rqnoj.cn/ProblemPic/P698-101656.png[/img]

观察图片,易发现圆内的内接矩形对角线交点必过圆心(初中证明……)

所以只要找到所有对角线就行了


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cstdlib>
using namespace std;
#define MAXN (100+10)
int n,c=0,m=0,a[MAXN];
int main()
{
	scanf("%d",&n);
	a[1]=0;
	for (int i=2;i<=n;i++)
	{
		scanf("%d",&a[i]),c+=a[i];
		if (!a[i]) i--,n--;
		else a[i]=c;
	}
	int p;
	scanf("%d",&p);c+=p;
	int l=1,r=1;
	while (r<=n&&l<=n)
	{
		if (a[r]-a[l]==c/2) {/*cout<<l<<' '<<r<<endl;*/m++;l++;}
		else if (a[r]-a[l]<c/2) r++;
		else l++;
	}
	cout<<m*(m-1)/2<<endl;
	return 0;
}