为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。
USACO/ariprog
来自NOCOW
< USACO
[编辑] 分析
这道题就是暴力搜索,时限是5s,方法是很简单的:枚举所有的可能解,注意剪枝。
但是在编程细节上要注意,很多时候你的程序复杂度没有问题,但常数过大就决定了你的超时(比如说,你比别人多赋值一次,这在小数据时根本没有区别,但对于1个运行5s的大数据,你可能就要用10s甚至更多)。
具体来说,预处理把所有的bisquare算出来,用一个布尔数组bene[i]记录i是否是bisquare 另外为了加速,用list记录所有的bisquare(除去中间的空位置,这在对付大数据时很有用),list中的数据要有序。
然后枚举list中的数,把较小的作为起点,两数的差作为公差,接下来就是用bene判断是否存在n个等差数,存在的话就存入path中,最后排序输出。 此时缺少重要剪枝,会超时
思考程序发现,费时最多的地方是枚举list中的数,所以对这个地方的代码加一些小修改,情况就会不一样:
- 在判断是否存在n个等差数时,从末尾向前判断(这个不是主要的)。
- 在枚举list中的数时,假设为i,j,那么如果list[i]+(list[j]-list[i])×(n-1)>lim(lim是最大可能的bisquare),那么对于之后的j肯定也是大于lim的,所以直接break掉。(这个非常有效)
AC,最大数据0.464s(如果是PASCAL的话应该还不止。请看C++的GPF的程序)。
其实输出时可以不用排序,用一个指针b[i]存公差为i的a的链表,由于搜索时a是有序的,存到b[i]中也应是有序的,这样就可以直接输出。对极限数据b的范围应该不超过m^2/n=2500,即b:array[1..2500]of point; 而如果qsort的话,复杂度为n*logn,n<=10,000
枚举a,b也可以过的 。。要加几个小优化