天天看点

BZOJ 1800: [Ahoi2009]fly 飞行棋 这么小的数据。。O(n^2)

题目描述

给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列。请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形。

输入

第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度

输出

所构成不重复矩形的个数

样例输入

8

1

2

2

3

1

1

3

3

样例输出

3

提示

N<= 20

n才20呀,这么小,内存要求、时间要求都不重要,怎么都行。

那么一般的想法就是求出直径的条数,因为两条直径构成一个矩形,所以X条构成X*(X-1)/2个矩形。

那么求出直径的方法也很简单,直径平分一个圆嘛,只需要计算连续弧的和是否是总和的一半

然后统计一下就行了。

var n,i,j,d,sum,sum1:longint;
    a,f:array[0..1000000] of longint;
begin
  readln(n);
  sum:=0;
  for i:=1 to n do
  begin
    read(a[i]);
    sum:=sum+a[i];
  end;
  if sum mod 2=1 then
  begin
    writeln('0');
    halt;
  end;
  sum:=sum div 2;
  for i:=1 to n do
  begin
    sum1:=0;
    for j:=i to 2*n do
    begin
      sum1:=sum1+a[(j-1) mod n+1];
      if sum1=sum then
      begin
        inc(d);
        break;
      end;
    end;
  end;
  d:=d div 2;
  writeln(d*(d-1) div 2);
end.