zoukankan      html  css  js  c++  java
  • 2.5

    T1:

    直接rand,没分


    T2:

    考场上理解错题意了,以为一定要数字一一对应,并且它的子树可以只是一部分,然后就弄出了一个算法

    用f[x]表示有x的情况下,x与x子树一部分的方案数

    fg[x]表示x是否满足匹配

    那么如果左边的点是一样的,那么左边的匹配关系可以上穿

    右边同理;

    只有两边都一样,并且都匹配了,才可以继续上传

    于是得到:

    void dfs(int x)
    {
        if(!la[x]&&!ra[x])
        {
            if(!lb[x]&&!rb[x])
            {
                f[x]=1;
                fg[x]=1;
            }
            return ;
        }
        if(la[x]) dfs(la[x]);
        if(ra[x]) dfs(ra[x]);
        if(la[x]==lb[x]) f[x]+=f[la[x]];
        if(ra[x]==rb[x]) f[x]+=f[ra[x]];
        if(la[x]==lb[x]&&ra[x]==rb[x]&&fg[la[x]]&&fg[ra[x]])
        {
            f[x]++;
            fg[x]=1;
        }
    }

    然后,居然能过样例,交上去,当然爆0了


    考后,才发现它只要形状一样就行了,不用数字也一样,而且不用整颗子树

    我们可以用hash来确定树的形状

    我们发现,只要把左边hash进去,右边hash进去就可以确定形状了

    为了让初值不是0,我们把sz也hash进去了

    所以我们可以得到一个hash函数:

    hsh[x]=hsh[l[x]]*p1+hsh[r[x]]*p2+sz[x]*p3

    然后,交上去,wa35

    没事,只有把hash函数改的更玄学就行了

    所以,hsh[x]=(hsh[l[x]] xor p3)*p1+(hsh[r[x]] xor p3)*p2+sz[x]*p3

    然后就是常规的hash表操作


    T3:

    洛谷P3469 https://www.luogu.com.cn/problem/P3469

    详细分析可以看我的博客: https://www.cnblogs.com/shenbear/p/12228003.html

  • 相关阅读:
    java 策略模式
    Android使用ListView应该注意的地方
    Zxing android 解析流程
    java 工厂模式
    Java 单例模式
    TextView的属性详解
    java 装饰者模式
    CSS outline:none
    php数组
    利用Google API快速生成QR二维码
  • 原文地址:https://www.cnblogs.com/shenbear/p/12264961.html
Copyright © 2011-2022 走看看