BZOJ1800_fly飞行棋_KEY
看数据范围,N<=20!
你没看错,搜索都能过。
O(N^2)的做法,就是先求出有几对点之间的距离为圆周长的一半。
然后求C(N,2)即可。
code:
/************************************************************** Problem: 1800 User: yekehe Language: C++ Result: Accepted Time:0 ms Memory:820 kb ****************************************************************/ #include <cstdio> using namespace std; int N,sum[25],W,K; int main() { scanf("%d",&N); for(int i=1;i<=N;i++)scanf("%d",&sum[i]),sum[i]+=sum[i-1];//记录前缀和 if(sum[N]&1)return printf("0"),0;//特判无法构成的情况 W=sum[N]>>1;//圆周长的一半 for(int i=1;i<N;i++) for(int j=i+1;j<N;j++) if(sum[j]-sum[i-1]==W){ K++; } printf("%d",(K-1)*K>>1);//C(N,2) return 0; }