BZOJ 1800 [Ahoi2009]fly 飞行棋

1800: [Ahoi2009]fly 飞行棋

Description

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

Input

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

Output

所构成不重复矩形的个数

Sample Input

8
1
2
2
3
1
1
3
3

Sample Output

3

HINT

N<= 20


  明显只需要数直径。直径即弧长为半圆周,可以参考求对“重”点对的方法。加上前缀和。

 1 /**************************************************************
 2     Problem: 1800
 3     User: Doggu
 4     Language: C++
 5     Result: Accepted
 6     Time:16 ms
 7     Memory:820 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 const long long MOD = 100003;
12 int n, sum[25], jin = 1, tot = 0;
13 int main() {
14     scanf( "%d", &n );
15     for( int i = 1; i <= n; i++ ) scanf("%d",&sum[i]),sum[i]+=sum[i-1];
16     for( int i = 1; i <= n; i++ ) {
17         if(sum[i]-sum[jin]<sum[n]/2) continue;
18         for( ; jin<i; jin++ ) {
19             if(sum[i]-sum[jin]==sum[n]/2) {tot++;break;}
20             if(sum[i]-sum[jin]<sum[n]/2) {jin--;break;}
21         }
22     }
23     printf( "%d
", tot*(tot-1)/2 );
24     return 0;
25 }
26 
Math
原文地址:https://www.cnblogs.com/Doggu/p/bzoj1800.html