hdu4819 Mosaic 二維線段樹(樹套樹)

2021-07-25 07:46:48 字數 1553 閱讀 3453

/*

題目描述:原問題中拆分出來這樣的乙個問題:

給定乙個n*n的矩陣,查詢某一塊最大最小值,修改某乙個位置的值,運算元共有約1e5次

思路:二維的線段樹,寫法是樹套樹,其中修改操作略微複雜,大致可以表述為先「沿x軸生長,每生長一點,就沿著y軸延展」。

*/#pragma warning(disable:4786)

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

#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define for(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)

#define mem(a,x) memset(a,x,sizeof(a))

#define lson l,m,x<<1

#define rson m+1,r,x<<1|1

using namespace std;

const int inf = 0x3f3f3f3f;

const int mod = 1e9 + 7;

const double pi = acos(-1.0);

const double eps=1e-6;

const int maxn = 1e3 + 5;

int locx[maxn] , locy[maxn] , n;

struct nodey

;struct nodex

build(i << 1 , _l , mid);

build(i << 1 | 1 , mid + 1 , _r);

}int querymax(int i , int _l , int _r)

int querymin(int i , int _l , int _r)

}stx[4 * maxn];

void build(int i , int l , int r)

build(i << 1 , l , mid);

build(i << 1 | 1 , mid + 1 , r);

}void modify(int x , int y , int val)        //更新方式:沿x軸生長,每生長一點,就沿著y軸延展

else}}

}int querymin(int i , int x1 , int y1 , int x2 , int y2)

int querymax(int i , int x1 , int y1 , int x2 , int y2)

int main()

}printf("case #%d:\n",++kase);

scanf("%d",&q);

int x1 , y1 , x2 , y2 , a , b ;

for(int i = 0 ; i}

return 0;

}

HDU 4819 Mosaic 二維線段樹

題目大意 裸題,不解釋,上模板。比較省記憶體的寫法 hdu 4819 pragma comment linker,stack 102400000,102400000 include include include include include include include include inc...

HDU 4819 Mosaic 二維線段樹

給定乙個 的矩陣,每個格仔都有乙個數,再給出 個詢問,每次詢問以 為中心的邊長為 的正方形矩陣中的最大值和最小值,並修改 的值為 四叉樹 對於查詢矩陣的最值 修改問題,考慮二維線段樹,參照一維線段樹的寫法 每次將區間二分成兩個子區間,對應矩陣應對 同時二分,也就是 個子矩陣,即左上 右上 左下,右下...

HDU 4819 二維線段樹

13年長春現場賽的g題,赤裸裸的二維線段樹,單點更新,區間查詢 不過我是第一次寫二維的,一開始寫t了,原因是我沒有好好利用行段,說白一點,還是相當於枚舉行,然後對列進行線段樹,那要你寫二維線段樹幹嘛 二維就是在每個行段也建一棵樹,來代表這個區間的行裡的某些列的值 其他操作倒是不難,因為有一維的功底,...