1. 程式人生 > 其它 >高維字首和(差分)(sosdp)

高維字首和(差分)(sosdp)

高維字首和(差分)(sosdp)

高維字首和

  • 二維字首和:\(s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1]\)
  • 三位字首和:\(s[i][j][k]=s[i-1][j][k]+s[i][j-1][k]+s[i][j][k-1]-s[i-1][j-1][k]-s[i-1][j][k-1]-s[i][j-1][k-1]+s[i-1][j-1][k-1]\)
    \(\dots\)
    設空間的維度為 \(k\),則:
  • 時間複雜度:\(O(|高維空間容量|\times 2^k)\)
    另外一種求解方式:
  • 二維:
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            a[i][j]+=a[i-1][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            a[i][j]+=a[i][j-1];
  • 三維:
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=p;k++)
                a[i][j][k]+=a[i-1][j][k];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=p;k++)
                a[i][j][k]+=a[i][j-1][k];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;k<=p;k++)
                a[i][j][k]+=a[i][j][k-1];

\(\dots\)

  • 時間複雜度:\(O(|高維空間容量|\times k)\)

高維差分

  • 二維差分
    在子矩陣(\((x_1,y_1)\)\((x_2,y_2)\) 分別為子矩陣左上角和右下角下標)中加上一個數 \(k\),先差分:\(s[x_1][y+1]+=k,s[x_2+1][y_1]-=k,s[x_1][y_2+1]-=k,s[x_2+1][y_2+1]+=k\),再取字首和
  • 三維差分
二進位制表示
000 \(s[x_1][y_1][z_1]+=k\)
001 \(s[x_1][y_1][z_2+1]-=k\)
010 \(s[x_1][y_2+1][z_1]-=k\)
011 \(s[x_1][y_2+1][z_2+1]+=k\)
100 \(s[x_2+1][y_1][z_1]-=k\)
101 \(s[x_2+1][y_1][z_2+1]+=k\)
110 \(s[x_2+1][y_2+1][z_1]+=k\)
111 \(s[x_2+1][y_2+1][z_2+1]-=k\)

\(\dots\)