zoukankan      html  css  js  c++  java
  • 2021CCPC河南省省赛

    大一萌新,第一次打比赛,虽然是线下赛,但送气球的环节还是很赞的!
    这里主要是补一下自己的弱项和考试时没有做出来的题目。
    1002(链接之后再放,官方还没公开题目...)
    先说一下第二题,这个题一看就是个推式子的题目,容易发现,每一种方案的概率都是一样的且都是(m^n),即每一次选择技能都会有(m)种技能可选。接下来考虑最后对答案的贡献,容易发现,统计贡献时,哪种技能我们并不关心,我们关心的是它出现的次数,并且容易想到将每个技能分开考虑。考虑某个技能(例如技能1对答案的贡献),首先他出现的次数我们要枚举,比如出现了i次,那么在这种情况下,剩下(n-i)个位置,我们不确定,我们只知道了技能1不能再选了,那么技能1在这种情况下的方案数就是((m-1)^{n-i}),所以技能1对答案的总的贡献为(sum_{i=1}^{n}C^{i}_{n}*(m-1)^{n-i}*i^2),当然一共有m个技能,我们再将这个值乘以m就是我们最终的答案。
    PS:代码只是通过了样例,还没有跑过全部数据,官方还没有公开题目...

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1e5+10,P=1e9+7;
    int n,m;
    ll jc[N],inv_jc[N];
    inline ll power(ll x,ll y)
    {
        ll ans=1;
        while(y)
        {
            if(y&1) ans=ans*x%P;
            x=x*x%P;
            y>>=1;        
        } 
        return ans%P;
    }
    
    inline void prework()
    {
        int s=1e5+5;
        jc[0]=inv_jc[0]=1;
        for(int i=1;i<=s;++i) jc[i]=jc[i-1]*i%P;
        inv_jc[s]=power(jc[s],P-2);
        for(int i=s-1;i>=1;--i) inv_jc[i]=inv_jc[i+1]*(i+1)%P;
    }
    
    inline ll C(int n,int m)
    {
        return jc[n]*inv_jc[m]%P*inv_jc[n-m]%P;
    }
    
    int main()
    {
    //    freopen("1.in","r",stdin);
        prework();
        int T;scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            ll ans=0;
            for(int i=1;i<=n;++i)
            {
                ans=(ans+C(n,i)*power(m-1,n-i)%P*i*i%P)%P;
            }
            ans=ans*m%P;
            ans=ans*power(power(m,n),P-2)%P;
            printf("%lld
    ",ans);
        } 
        return 0;
    } 
    

    1006
    这种题,....,头秃,这也就应验了我们教练的一句话,考试前期千万不要浪,到后期一定要任性起来...这种题其实看到题的时候就想过答案可能会很小,但没敢写,等下一次的区域赛一定要大胆起来!
    1007
    这个题感觉是有点亏的题了,考试的时候,队友已经知道了做法,可他当时正在推数学式子,他给我讲的时候我也没哟听进去...(我的锅。)于是到最后这个题都没有写...
    初看这个题,我是被他的对角线都不同给吓倒的,人还是不能怂啊!
    首先可以发现他要求的不同只是主对角线的元素不同,副对角线上的元素不同,并没有说要将主对角线和副对角线上的元素全部不同,所以我们就可以分开考虑主对角线和副对角线。假如说我们预处理出以每个元素为中心的主对角线的最长长度l[i][j]和以该元素为中心的副对角线的最长长度r[i][j],那么以该元素为中心的符合条件的矩阵为(lceilfrac{min(l[i][j],r[i][j])}{2} ceil).接下来考虑怎么预处理以每个元素为中心的最长的对角线的长度,我们可以单独的将每个对角线拉出来组成一个序列。这样好操作。初始值,每个值都是1,然后将半径r拓展,但有个比较显然的结论就是若i-1的r不为1,则i的半径至少为r-1,我们可以利用这个信息进行快速扩展。总的复杂度应该为O(n^2)的。代码太丑了,勿看!!!

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010,M=1e6+10;
    int cnt[M],n,a[N][N],r1[N][N],r2[N][N];
    //分别表示主对角线,副对角线的最长的长度。 
    inline bool check1(int x,int y,int d)
    {
        d--;
        if(x-d>=1&&y-d>=1&&x+d<=n&&y+d<=n&&!cnt[a[x-d][y-d]]&&!cnt[a[x+d][y+d]]&&a[x-d][y-d]!=a[x+d][y+d]) return true;
        return false;
    }
    
    inline bool check2(int x,int y,int d)
    {
        d--;
        if(x-d>=1&&y+d<=n&&x+d<=n&&y-d>=1&&!cnt[a[x-d][y+d]]&&!cnt[a[x+d][y-d]]&&a[x-d][y+d]!=a[x+d][y-d]) return true;
        return false;
    }
    
    inline solve1(int x,int y)
    {
        cnt[a[x][y]]++;
        x++;y++;
        while(x<=n&&y<=n)
        {
            if(r1[x-1][y-1]==1)
            {
                cnt[a[x-1][y-1]]--;
                cnt[a[x][y]]++;
                int d=2;
                while(check1(x,y,d)) 
                {
                    cnt[a[x-d+1][y-d+1]]++;
                    cnt[a[x+d-1][y+d-1]]++;
                    d++;
                }
                r1[x][y]=d-1;
            }
            else 
            {
                int d=r1[x-1][y-1];
                cnt[a[x-r1[x-1][y-1]][y-r1[x-1][y-1]]]--;
                cnt[a[x-r1[x-1][y-1]+1][y-r1[x-1][y-1]+1]]--;
                while(check1(x,y,d))
                {
                    cnt[a[x-d+1][y-d+1]]++;
                    cnt[a[x+d-1][y+d-1]]++;
                    d++;
                }
                r1[x][y]=d-1;
            }
            x++;y++;
        }
        x--;y--;
        cnt[a[x][y]]--;
    }
    
    inline solve2(int x,int y)
    {
        cnt[a[x][y]]++;
        x++;y--;
        while(x<=n&&y>=1)
        {
            if(r2[x-1][y+1]==1)
            {
                cnt[a[x-1][y+1]]--;
                cnt[a[x][y]]++;
                int d=2;
                while(check2(x,y,d)) 
                {
                    cnt[a[x-d+1][y+d-1]]++;
                    cnt[a[x+d-1][y-d+1]]++;
                    d++;
                }
                r2[x][y]=d-1;
            }
            else 
            {
                int d=r2[x-1][y+1];
                cnt[a[x-r2[x-1][y+1]][y+r2[x-1][y+1]]]--;
                cnt[a[x-r2[x-1][y+1]+1][y+r2[x-1][y+1]-1]]--;
                while(check2(x,y,d))
                {
                    cnt[a[x-d+1][y+d-1]]++;
                    cnt[a[x+d-1][y-d+1]]++;
                    d++;
                }
                r2[x][y]=d-1;
            }
            x++;y--;
        }
        x--;y++;
        cnt[a[x][y]]--;
    }
    
    int main()
    {
    //    freopen("1.in","r",stdin);
        int T;scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(int i=1;i<=n;++i)
                for(int j=1;j<=n;++j) 
                {
                    scanf("%d",&a[i][j]);
                    r1[i][j]=r2[i][j]=1;   
                }
            for(int i=1;i<=n;++i)//处理主对角线 
            {
                solve1(i,1);//分别以(i,1)开始的对角线。 
                solve1(1,i);//分别以(1,i)开始的对角线。 
            }          
            for(int i=1;i<=n;++i)//处理副对角线
            {
                solve2(1,i);//以(1,i) 
                solve2(i,n);//以(i,m) 
            } 
            int ans=0;
            for(int i=1;i<=n;++i)
            {
                for(int j=1;j<=n;++j)
                {
                    r1[i][j]=2*r1[i][j]-1;
                    r2[i][j]=2*r2[i][j]-1;
                    ans+=ceil(min(r1[i][j],r2[i][j])/2.0);   
                }  
            } 
            printf("%d
    ",ans);
        }
        return 0;
    } 
    
  • 相关阅读:
    Spring注解@Component、@Repository、@Service、@Controller区别
    多线程基本知识
    分布式与集群的区别
    Top 10 Uses For A Message Queue
    redis 总结
    redis 学习
    线程控制-延时与守护
    kafka 教程(一)-初识kafka
    Kafka 教程(二)-安装与基础操作
    ZooKeeper-安装
  • 原文地址:https://www.cnblogs.com/gcfer/p/15490201.html
Copyright © 2011-2022 走看看