zoukankan      html  css  js  c++  java
  • hdu 5084 HeHe (观察思考题)

    题意:

    给一个n行n列的矩阵M。这个矩阵M由2n-1数构成。分别是t1,t2,....t(2n-1)。

    m个query。每个query形式:ri, ci。

    第i个query的答案 ans[i]=E[(ri+ans[i-1])%n ][(ci+ans[i-1])%n]      E=M*M

    求m个query的答案和。即ans[1]+...ans[m]的答案。

    矩阵形式:

    t3  t4  t5                          t4  t5  t6  t7

    t2  t3  t4                          t3  t4  t5  t6

    t1  t2  t3                          t2  t3  t4  t5

                   t1  t2  t3  t4

    思路:

    直接算M*M,时间复杂度是n^3,会超时。考虑到矩阵具有特殊性,找出规律。

    ans[x][y]=t[n+1-x](增)*t[n-1+y](减)+....+a[2n-x]*a[y]

    ans[x+1][y+1]=ans[x][y] + 某个东西 - 某个东西    (这里不写出,在记事本上写一下便可观察出)

    这样算M*M大约时间复杂度大约是n^2

    代码:

    int n,m,r,c;
    int t[2500];
    int ans[1005][1005];
    
    int main(){
       //freopen("test.in","r", stdin);
    
        while(scanf("%d",&n)!=EOF){
            rep(i,1,2*n-1) scanf("%d",&t[i]);
            mem(ans,0);
            rep(i,1,n) rep(j,1,n){
                if(i-1<1 || j-1<1)
                    rep(k,0,n-1) ans[i][j]+=t[n+1-i+k]*t[n-1+j-k];
                else{
                    ans[i][j]=ans[i-1][j-1];
                    ans[i][j]-=t[2*n-(i-1)]*t[j-1];
                    ans[i][j]+=t[n+1-i]*t[n-1+j];
                }
            }
    
            ll sum=0;
            int ANS;
            scanf("%d",&m);
            scanf("%d%d",&r,&c);  ANS=ans[r+1][c+1];  sum+=ANS;
            rep(i,2,m){
                scanf("%d%d",&r,&c);
                ANS=ans[(r+ANS)%n+1][(c+ANS)%n+1];
                sum+=ANS;
            }
            printf("%I64d
    ",sum);
        }
    
        //fclose(stdin);
    }
  • 相关阅读:
    暑假每周学习进度-7
    暑假每周学习进度-6
    寒假生活05
    寒假生活04
    寒假生活03
    寒假生活02
    寒假生活01
    软件设计师2019模拟小测
    第二周学习记录
    2019秋季学习计划
  • 原文地址:https://www.cnblogs.com/fish7/p/4077609.html
Copyright © 2011-2022 走看看