HDU 1559最大サブ2次元マトリクスアレイツリー

もし×Mの行列を与えるnは整数上で部分行列X×Yを見つけるために、ある部分行列の最大とすべての要素。

 
入力
入力データTの最初の行の正の整数、Tがテストデータのセットを表します。まず、各動作のためのテストデータのセット4つの正の整数M、N、X、Y(0 <M、N <1000および0 <X <= Mおよび0 <Y <= n)は、指定された矩形を表し有しますm行n列。次に、m行n個の各々とこの行列1000より大きくない正の整数です。
 
出力
各試験、出力整数ため、サブ行列の最大値を表します。
 
サンプル入力
1
4 5 2 2
3 361 649 676 588
992 762 156 993 169
662 34 638 89 543
525 165 254 809 280
 
サンプル出力
2474

 

 

#include <ビット/ STDC ++。H>
長い長いLLのtypedef。
名前空間stdを使用。
int型ARR [1010] [1010]、M、N、X、Y。
int型lowbit(int型x)は、
{
    X&-x返します。
}
ツリーの///二次元アレイ
ボイド追加(int型のx、int型Y、INT TT)///変性単一点
{
    用(INT I = X; I <M、I + = lowbit(I))
        用(INT J = yであり、j <N; J + = lowbit(J))
        {
            ARR [I] [J] + = TT。
        }
}
あなたは(あなたは、yとx)の合計します
{
    int型、A = 0;
    ( -  = lowbit(I)I; I int型I = X)のために
        用(int型J = Y; J; J  -  = lowbit(J))
        {
            RES + = ARR [I] [J]。
        }
    解像度を返します。
}
INTクエリ(INT L、INT B、int型のR、INT T)///和行列
{
    戻り和(R、T)+ SUM(L  -  1、B  -  1) -  SUM(R、B  -  1) - 和(L  -  1、T)。
}
メインint型()
{
    int型T;
    scanf関数( "%のD"、&T)。
    一方、(T  - ){
        scanf関数( "%D%D%D%D"、&M、およびN、およびX&Y)。
        以下のために(INT I = 1; I <= M; I ++){
            {(J ++; J <= Nのint J = 1)のために
                ARR [I] [J] = 0;
            }
        }
        int型のk = 0年、GG。
        以下のために(INT I = 1; I <= M; I ++){
            {(J ++; J <= Nのint J = 1)のために
                scanf関数( "%のD"、&K);
                (i、j、k)を追加します。
            }
        }
        以下のために(INT I 1 =; I + X  -  1 <= M; I ++){
            {;  - ;(j ++ 1 <= N J + Y INT J = 1)のために
                GG =クエリ(I、J、I + X  -  1、J + Y  -  1)。
                年= MAX(年GG)。
            }
        }
        printf( "%dの\ n" は、ANS)。
    }
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/lyj1/p/11915472.html