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);
    }
  • 相关阅读:
    HDOJ 1207 汉诺塔II
    [转]写代码的小女孩
    POJ Subway tree systems
    HDOJ 3555 Bomb (数位DP)
    POJ 1636 Prison rearrangement (DP)
    POJ 1015 Jury Compromise (DP)
    UVA 10003
    UVA 103 Stacking Boxes
    HDOJ 3530 Subsequence
    第三百六十二、三天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/fish7/p/4077609.html
Copyright © 2011-2022 走看看