NOIP模拟 8

T1

水题,可是没A,惭愧。

值得一提的是,虽然我忘了kmp,现场制造的kmp因为缺少针对题目的特判挂了,但是现场制造的kmp板子能过字符串板子题..

对..把板子改装了...而且改对了!

1 nx[0]=-1;
2 for(int i=2,j=-1;i<=len;++i){
3     while(~j&&ch[j+1]!=ch[i]) j=nx[j];
4     nx[i]=++j;
5 }
View Code

 

 

T2

也比较水,可是没A,惭愧。

初始化的时候清零犯了低错,死了。改了,A了。

记录一个骚操作,仔细品味发现它非常巧妙

for(register int i=fr[x];i;i=mo[i].pr)
    {
        register int y=mo[i].to;
        if(!dfn[y])
        {
            tarjan(y);
            low[x]=min(low[x],low[y]);
            if(low[y]>=dfn[x]&&dfn[y]<=dfn[n])//后一个条件保证了只在n的祖先处触发
            {
                son++;
                if(x!=1||son>1) cut[x]=1;
            }
        }
        else low[x]=min(low[x],dfn[y]);
    }
View Code

 

T3

做的很痛苦,改的也很痛苦,因为看不懂题解,只好。。

自主研发:前提:序列抽象为01,枚举断点转化成序列,每个序列把1挪到序列两端可以保证答案不漏

       考虑每个1,它挪到左边代价为左边0的个数,右边代价为右边0的个数

       所以往0多的方向走不如往少的方向走

       一个1,它的哪边0多,在序列上具有单调性

       所以就让它们左边0少的去左边,其余去右边

       分界线就是0的数量的中点(偶数就是两个中间的0之间,奇数就是中间那个0)

每个断点,O(1)求解,复杂度O(N)

posted @ 2019-07-25 18:07  Yxsplayxs  阅读(354)  评论(0编辑  收藏  举报