17.8.17B组总结

来源:互联网 发布:《幻》知乎 编辑:程序博客网 时间:2024/06/04 23:26

17.8.17B组总结

前言

奇怪的一天,第一题莫名WA了,只有后两题暴力分80,但改题特别快,立马280(第三题很奇怪,不会做)。

T1

其实只是一个树形DP,但考试时我状态设得不太对,第二维只有0/1,没有很好的表示出状态。于是连这个点都没过:
4
0 68 70
1 2 10
1 1 9
1 1 1
这里写图片描述
(图画得有些丑)
坑惨我了。其实设f[i,j]表示第i个点,有j的能量的最多可以满足的点,即可。
大致dg过程:

procedure dg(x:longint);var        i,y,k,j:longint;begin        for i:=e[x] to w[x] do                f[x,i]:=1;        i:=last[x];        while i<>-1 do        begin                y:=tov[i];                if y<>c[x] then                begin                        dg(y);                        for j:=w[x] downto 0 do                                for k:=0 to j do                                        f[x,j]:=max(f[x,j],f[y,k]+f[x,j-k]);                end;                i:=next[i];        end;end;

T2

这是道水题,我考试时已经接近想到了正解,然而并没有深入思考(skb),于是只拿了50。
其实,只要按b[i]排个序,一个一个搜,找出正解即可(这题方法也很多,什么线段树,差分约束,二分之类的也可以做)。
神奇的枚举过程:

        for i:=1 to n*2 do        begin                if a[i,2]=1 then                begin                        dec(sum,a[i,1]);                        inc(g);                end                else                begin                        if ans<sum+g*a[i,1] then                        begin                                ans:=sum+g*a[i,1];                                w:=a[i,1];                        end;                        dec(g);                end;        end;

T3

考试实在没时间了,就匆匆打了个暴力,尴尬的发现还有个点错了,本来可以拿40的(其实30还算不错了)。
看到正解时我一脸懵逼,不过,我还是在第9次提交后ac了。本题看起来十分繁琐,实则……额,还是很繁琐,调了我半天。事实上,先将b复制一遍,再记录一个next数组即可,next[i,j]表示在B串的第i个位置之后,第一次出现hash值为j的串的位置。然后从1~m的b扫一遍,每次扫的时候更新一下答案,最后输出即可。(推荐每个数*123^n,模数10000007)。
预处理(next数组):

        for i:=1 to t do        begin                next[m*2+1,i]:=m*2+1;                next[(m+1)*2,i]:=m*2+1;        end;        for i:=m*2 downto 1 do        begin                fillchar(y,sizeof(y),254);                y[0]:=0;                ss:=1;                for j:=0 to n-1 do                begin                        if i+j<=2*m then                                y[j+1]:=y[j]+((ord(b[i+j])-96)*ss) mod mo;                        ss:=(ss*123) mod mo;                end;                for j:=1 to t do                begin                        next[i,j]:=next[i+1,j];                        if y[d[j]]=c[j] then                                next[i,j]:=i+d[j]-1;                end;        end;

考试还是要把握好时间,不要再出现想到正解却没时间码这种尴尬之事。