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...