uva 11992 為矩陣更新查詢段樹

2021-09-09 01:27:30 字數 1540 閱讀 7516

option=com_onlinejudge&itemid=8&page=show_problem&problem=3143

矩陣變成一行,然後計算位置。lrj給了線段樹陣列做法 可是我做的線段樹空間過大,直接爆掉,所以換方法了

主要還是測試自己的線段樹區間更新的模板

各種re+wa之後ac,,,,。

做的時候出現的幾個錯誤:

1、行和列弄錯

2、build初始化的時候,mmin mmax 都初始化為0才對

#include#include#includeusing namespace std;

#define lson(i) l , mid , (i)*2

#define rson(i) mid + 1 , r , ((i)*2 +1)

#define ll rt*2

#define rr (rt*2+1)

const int infmin = 0xffffffff;

const int infmax = 1000000009;//0x80000000;

const int maxn = 30001000;

struct node;

node nodes[maxn];

int mmax,mmin,sum;

void pushup(int rt)

void pushdown(int rt)

//if(nodes[rt].s && flag == 2)

if(nodes[rt].s)

}void build(int l,int r,int rt)

int mid = (nodes[rt].l+nodes[rt].r)/2;

build(lson(rt));

build(rson(rt));

//pushup(rt);

}void update(int l,int r,int add,int rt,int flag)

else

return;

}pushdown(rt);

int mid = (nodes[rt].l+nodes[rt].r)/2;

if(l<=mid)update(l,r,add,ll,flag);

if(r>mid)update(l,r,add,rr,flag);

pushup(rt);

}void query(int l,int r,int rt)/*1表示mmin 2--mmax 3-sum*/

pushdown(rt);

int mid = (nodes[rt].l+nodes[rt].r)/2;

if(l<=mid)query(l,r,ll);

if(r>mid)query(l,r,rr);

pushup(rt);

}void clr()/*每次查詢之前使用*/

int main()

}else

printf("%d %d %d\n",anssum,ansmin,ansmax);}}

}return 0;

}

uva11992區間修改線段樹

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

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

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 查詢子矩陣元素的和 最小值 最大值...

UVa 1152 和為0的四個值

暴力o n4 超時。思路1 二分。列舉所有a b a屬於a,依次類推 把所有 a b 記錄下來放在乙個陣列sum中,對sum排序。然後列舉所有 c d 在 sum 中二分查詢有幾個這樣的值,用upper bound lower bound 就是個數,累計到結果中。o n 2logn 執行2750ms...