区域赛套题 第二场解题报告

解题报告转摘自其它博客。

最好看这里 http://acmicpc.info/archives/1229

A  这题非常简单,全场所有队都过了。

B      此题只需要枚举每个盒子还剩了几个糖,算出其概率就可以了,不过需要推一会儿公式。

        i = 0,1,...,n

C
  分两部分处理。首先计算出周长为L的本质不同三角形个数,可以O(n)递推;而后对于原问题可以直接枚举n的约数来处理。源代码主干如下:
   

 for(int i=1; i<ran; i++)  a[i]=add(a[i-2],i/3-i/4);
 for(int i=1; i<ran; i++)  for(int j=i+i; j<ran; j+=i)   a[j]=add(a[j],mod-a[i]);
 for(int i=1; i<ran; i++)  for(int j=i,t=a[i]; j<ran; j+=i,t=add(t,t))   g[j]=add(g[j],t);

D
  设一个阈值T,度<=T的点设为度小的点;其他点设为度大的点。对于每个度大的点记录一个其各颜色度小邻居列表,以及记录度大点互相之间的边列表。

  对于度小的点的变色操作直接维护与他相邻的所有边的信息;对于询问操作,依次询问每个度大的点的所有信息就可以了。

  在T取得比较合适的情况下,时间复杂度大约是每次操作O(n^(2/3))。此题唯一需要注意的地方是有重边要合并。

E 据说标程是KMP,我不会做。

 

F:
   基本想法是枚举造了多少个农民。显然在造了至多X个农民之后我们就可以在造农民这段时间内攒出造一个农民的钱了(也就是说现在只是缺CD不缺钱了),因此,首先模拟到造满X个农民的情况,以后,造农民的过程成为了连续的过程。而且农民个数-需要的时间的这个函数是单峰的,因此可以三分造了多少个农民。此题需要注意的地方还有需要高精度。

G:
首先用O(n^2)时间构造一张表表示从a到b(inclusive)我总共赢了多少局,最后没打完的一局是从哪儿开始的;然后枚举p和q,利用刚才那张表,把模拟一组(p,q)的过程复杂度降到O(1)。细节问题非常多。

 

H:
设L=max(m,t,t_i)。先将所有输入整理为长L的形式。在作了一些矩阵的平方之后得到了最多O(qlogn)个矩阵。然后用初始的L个值依次左乘这些矩阵,结果时间复杂度为O(qL^2logn),比把那些矩阵直接乘起来小了一个L.

 

I   DP

J
此题就是询问a*b*c<=n的有序三元组(a,b,c)的数目。显然a,b,c当中至少有一个<n^(1/3),设为a,枚举这个数;而后b,c当中至少有一个<(n/a)^1/2,枚举这个数。通过积分可知,这样做的复杂度为O(n^2/3)。


K
此题如果处理得不好可能会造成非常多的特殊情况需要特判。一种比较简洁的处理方法是:首先建有向图i->(i*10+j)%n,然后沿着这个图反向从0'广搜0算出每个点到0的最短距离,最后从0开始沿着这个图正向广搜,利用刚才的最短距离表直接递推出答案的每一位。另一种处理方法是直接用string记录答案,不过要注意常数。时间复杂度每组数据O(n)。






posted @ 2013-04-23 22:57  yefeng1627  阅读(285)  评论(0编辑  收藏  举报

Launch CodeCogs Equation Editor