POJ 2155 Matrix(二維樹狀陣列)

2022-05-08 14:06:09 字數 1809 閱讀 4737

題意:對於乙個n行n列的矩陣,有兩種操作:

1、c x1 y1 x2 y2,將左上角(x1, y1),右下角(x2, y2)的矩陣反轉(0變1,1變0)。

2、q x y詢問a[x, y]的值。

分析:1、將a[x1][y1]加1(翻轉一次),可使左上角(x1, y1),右下角(n,n)的矩陣中每個元素的sum(x, y)都加1,但是顯然,只需要將左上角(x1, y1),右下角(x2, y2)的矩陣中每個元素的sum(x, y)都加1即可,所以要使其他無關元素再反轉回來,即

(1)將左上角(x1 + 1, y1),右下角(n,n)的矩陣中每個元素的sum(x, y)再加1,這部分元素反轉兩次等於沒反轉,同理,

(2)將左上角(x1, y2 + 1),右下角(n,n)的矩陣中每個元素的sum(x, y)再加1

(3)將左上角(x2 + 1, y2 + 1),右下角(n,n)的矩陣中每個元素的sum(x, y)再加1

實質上,只將4個元素加1便達到了目的。

2、詢問的時候,直接詢問sum(x,y)%2,即左上角(1, 1),右下角(x, y)的矩陣中的加1元素的個數%2。

3、解題過程中充分利用sum函式的性質,即當元素(x, y)加1時,所有左上角(1,1),右下角(xx,yy)的矩陣sum(xx,yy)都加了1,即若要將左上角(x1, y1),右下角(x2, y2)的矩陣反轉,無需將矩陣內每個元素都一一反轉,而是用左上角(x1, y1)加1後的情況,代替了這一區域矩陣內元素都加1的情況。

#pragma comment(linker, "/stack:102400000, 102400000")

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define min(a, b) ((a < b) ? a : b)

#define max(a, b) ((a < b) ? b : a)

#define lowbit(x) (x & (-x))

const double eps = 1e-8;

inline int dcmp(double a, double b)

typedef long long ll;

typedef unsigned long long ull;

const int int_inf = 0x3f3f3f3f;

const int int_m_inf = 0x7f7f7f7f;

const ll ll_inf = 0x3f3f3f3f3f3f3f3f;

const ll ll_m_inf = 0x7f7f7f7f7f7f7f7f;

const int dr = ;

const int dc = ;

const int mod = 1e9 + 7;

const double pi = acos(-1.0);

const int maxn = 1000 + 10;

const int maxt = 10000 + 10;

using namespace std;

int n;

int matrix[maxn][maxn];

int sum(int x, int y)

}return ans;

}void add(int x, int y, int value)

}}int main()

else

}if(t) printf("\n");

}return 0;

}

POJ 2155 Matrix 二維樹狀陣列

又是一道樹狀陣列的題目,而且是一道二維的好題 題目要求是,一些操作,可能是對某個矩陣內的所有值取反,可能是問的是某個位置的值 如圖 假如我們要把b矩陣的所有值都取反,我們只需要操縱矩陣的四個頂點即可,更新左下角頂點的值增1相當於把區域abcd的變換次數增1,左上角頂點的值增1,相當於區域ac的變換次...

二維線段樹 POJ 2155 Matrix

風格 www.notonlysuccess.com 題目大意 剛開始,整個矩陣為0 c操作 對乙個矩陣進行0,1取反 q操作求該點的數字是什麼 演算法 二維線段樹,具體自己模擬吧 include include include include include include include incl...

POJ 2155 Matrix 二維線段樹

題目大意 乙個二維座標軸上有很多點,點不是0就是1。然後又兩種操作。c 改變以 x1,y1 為左上頂點 x2,y2 為右下頂點 中的每乙個點 0變1 1變0 q 輸出 a x y 然後每次改變都取異或 這樣的話就意味著改變偶數次就變回來了 奇數次的話就是做了改變的 include include i...