UVA 11992 線段樹將矩陣轉化為一維陣列

2021-09-01 15:15:03 字數 1933 閱讀 1845

uva11992  區間求和,最大值,最小值

題意:r行c列的全0矩陣   有三種操作 1 x1 y1 x2 y2 v子矩陣(x1,y1,x2,y2)所有元素增加v

2 x1 y1 x2 y2 v子矩陣(x1,y1,x2,y2)所有元素設為v

3 x1 y1 x2 y2 查詢子矩陣元素的和、最小值、最大值

題解:由於r<=20,r*c<=1e6,所以我們可以將矩陣展開成一維,每次詢問進行(x2-x1)次查詢操作即可。這樣就轉換成了線段樹問題。

我們做addv標記加val操作,用setv標記變val操作;若遇到setv,我們需要清空addv,反之則不需要。若在操作的時候setv和addv都存在,那麼先執行setv操作,之後執行addv操作。

對於一段區間執行setv操作或者addv操作,我們都能直接得到這段區間的元素和,最小值和最大值,不需要再向下遍歷。

pushdown():用作標記的下移。

add():用於加val操作

update():用於變val操作

query():用於查詢操作

#include #include #include #include #include #include #include #include #include #include using namespace std;

#define rson c<<1|1

#define lson c<<1

const int inf = 0x3f3f3f3f;

const int maxn=1e6+1000;

struct nodee[maxn*3];

void build(int a,int b,int c)

int mid=(a+b)/2;

build(a,mid,lson);

build(mid+1,b,rson);

}void pushdown(int c)

if(e[c].addv!=0)

}void add(int a,int b,int c,int val)

int mid=(e[c].l+e[c].r)/2;

pushdown(c);

if(b<=mid)add(a,b,lson,val);

else if(a>mid)add(a,b,rson,val);

else

e[c].maxv=max(e[lson].maxv,e[rson].maxv);

e[c].minv=min(e[lson].minv,e[rson].minv);

e[c].sum=e[lson].sum+e[rson].sum;

}void update(int a,int b,int c,int val)

pushdown(c);

int mid=(e[c].l+e[c].r)/2;

if(b<=mid) update(a,b,lson,val);

else if(a>mid) update(a,b,rson,val);

else

e[c].maxv=max(e[lson].maxv,e[rson].maxv);

e[c].minv=min(e[lson].minv,e[rson].minv);

e[c].sum=e[lson].sum+e[rson].sum;

}node query(int a,int b,int c)

}int main()

{ #ifndef online_judge

freopen("in.txt","r",stdin);

#endif // online_judge

int r,c,m;

while(scanf("%d%d%d",&r,&c,&m)!=eof)

{int i,j,k,a,x1,y1,x2,y2,val;

build(1,r*c,1);

for(i=0;i這一道題還增加了乘法與pow運算

uva 11992 為矩陣更新查詢段樹

option com onlinejudge itemid 8 page show problem problem 3143 矩陣變成一行,然後計算位置。lrj給了線段樹陣列做法 可是我做的線段樹空間過大,直接爆掉,所以換方法了 主要還是測試自己的線段樹區間更新的模板 各種re wa之後ac,做的時...

uva11992區間修改線段樹

資料範圍很大,但是可以每行建乙個線段樹,化為線性的 set的優先順序高於add pushdown的時候相當於在add和sett中對乙個整個的區間進行 賦值 一樣,所以還要加上改sum,min1,max1的部分 三個詢問可以一起做。include include include include inc...

UVA 12663(線段樹 二分)

題意 現在有n座橋,給出每個橋的高度,現在會發m次的洪水,每次洪水會漲至a高度,然後退回b的高度,問有多少橋至少被淹沒了k次。題解 先吐槽一下 唉,人太蠢怎麼辦?連二分都沒有想到,其實這一題的key就是想到二分,想到二分去解決,那麼這一題就是模板題了。吐槽完畢 很明顯直接模擬會超時。考慮使用二分,查...