2016.09.03【初中部 NOIP提高组 】模拟赛C题解

来源:互联网 发布:最新的网络用语 编辑:程序博客网 时间:2024/05/16 00:26

随意翻车,2333,怪我没仔细听以前的时间戳内容。

T1:

并查集是行不通的,公共祖先,压缩下就没了。所以另找方法:

      这道题有LCA的方法,但目前适合我们的只有一个名叫时间戳的方法。

                    记录每个点X的第一次访问时间st[x]和最后一次访问时间ed[x],若y在以X为根的子树中,则一定有st[x]<st[y]<ed[y]<ed[x]。

             可能很多人不明白最后一次访问时间,即他的儿子(包括儿子的儿子)中第一次访问时间的最大值。

<span style="font-size:14px;">procedure dg(ans:longint);var        j:longint;begin        j:=num[ans];        while j<>0 do        begin                if bz[d[j]]=0 then                begin                        bz[d[j]]:=1;                        inc(ans1);                        st[d[j]]:=ans1;                        dg(d[j]);                        en[d[j]]:=ans1;                end;                j:=pre[j];        end;end;</span>
请用邻接表,不谢!
T2:

第二题暴力O(n^2)过不了。由于以前做过差不多的题目,所以改题也快了许多!

            对于一个A[i],我们可以对b[i]进行分类讨论,即分成两大类:a[i]≥b[j],a[i]<b[j]。因为这两种的运算都是完全不相同的,一个是前者减后者,一个是后者减前者。

             即我们求出了a[i]≥b[j],j的值,答案则为a[i]*j-∑b[1~j],前提是有序!前提是有序,前提是有序,重要的事说三遍!前缀和实现!

              J的效率最多为O(n),所以有的同学说二分是多余的

             AC咯!等等!题目题目算的是(x-y)^2,如果前最和是根本实现不了的,试着拆分!不错

             (x-y)^2=a^2+b^2-2ab,经过巧妙的拆分后,弄个平方和前缀和就可以了!

             不过这么做也会错,因为a^2要多乘个个数。

             再说下概率问题:对于一个a[i],比赛场次为(n-1)!,最后又要/n!,不就是除个N就可以了???????

T3:
好数字,很好,很好。
           可以发现,结果即奇偶条件+前后N位条件,可以分解为:前后N位条件*2-即为①又为②的条件总数。
           即用递推来算出符合一个条件的个数:设f[i,j]表示选i个数和为j的方案数:f[i,j]=f[i,j]+f[i-1,j-a[k]]。初值f[0,0]:=1。算出来后,计算出即为①又为②的条件总数。怎么算呢?
           

           所以前n位中奇数位之和=后n位中偶数位之和 且

           前n位中偶数位之和=后n位中奇数位之和

            即算出前面选奇数个数的方案和∑f[(n+1) div 2,1-maxn*(n+1) div 2]^2,偶数也是。

            为什么可以这样,因为我们是选i个,而不是前i个,况且也可以理解为交换位置,即(n+1) div 2个 奇数都移到前面去。反之。注意:不要双重(c++除外),直接单重,乘起来就好,因为同为乘法。

            为什么要平方,因为我们枚举是前N位,而题目要求的数列是2*n,两个的方案数为n^2。以上同这么理解。

             效率600ms+,不过可以尽量减少mod的次数可优化!


1 0