題目【模板】線段樹1:
rmq問題(range minimum/maximum query)和求區間和的問題可以用暴力法做,時間複雜度為o(n^2),用在本題會超時,所以我們選擇線段樹做。
線段樹是一種用於區間操作的資料結構,用二叉樹構造。如圖。
線段樹的每個節點代表了乙個區間。
防止超時,用了lazy標記。
1 #include2 #include3ε=(´ο`*)))唉#define maxn 100010
4 typedef long
long
ll;5
using
namespace
std;67
struct
node tree[maxn<<2+2
];10
int n, root = 1
;11 ll num[maxn+2], addv[maxn << 2+2];//
addv可以放在node裡面
12void pushup(int
x) 15
void pushdown(int
x) 23}24
void buildtree(int l,int r,int
x) 27
int mid = (l + r) >> 1
;28 buildtree(l, mid, x << 1
);29 buildtree(mid + 1, r, (x << 1) + 1
);30
pushup(x);31}
32void add(int l, int r, int k, int
x) 38
pushdown(x);
39int mid = (tree[x].l + tree[x].r) >> 1;40
if (l <= mid) add(l, r, k, x << 1
);41
if (r > mid)add(l, r, k, x << 1 | 1
);42
pushup(x);43}
44 ll print(int l, int r,int
x) 54
intmain()
67else72}
73return0;
74 }
題目2【模板】線段樹2:
比上面多了乙個求區間乘法。
需要考慮清楚乘法和加法誰先誰後的關係。
1 #include2 #include3view code#define maxn 100010
4 typedef long
long
ll;5
using
namespace
std;67
struct
node tree[maxn<<2
];11
int n, root = 1
,p;12 ll num[maxn], addv[maxn << 2], mult[maxn << 2
];13
void pushup(int
x) 16
void pushdown(int
x) 25
void buildtree(int l,int r,int
x) 28
int mid = (l + r) >> 1
;29 buildtree(l, mid, x << 1
);30 buildtree(mid + 1, r, x << 1|1
);31
pushup(x);32}
33void add(int l, int r, int k, int
x) 39
pushdown(x);
40int mid = (tree[x].l + tree[x].r) >> 1;41
if (l <= mid) add(l, r, k, x << 1
);42
if (r > mid)add(l, r, k, x << 1 | 1
);43
pushup(x);44}
45void multiply(int l, int r, int k, int
x) 52
pushdown(x);
53int mid = (tree[x].l + tree[x].r) >> 1;54
if (l <= mid)multiply(l, r, k, x << 1
);55
if (r > mid)multiply(l, r, k, x << 1 | 1
);56
pushup(x);57}
58 ll print(int l, int r,int
x) 68
intmain()
81else
if (k == 1
) 86
else91}
92return0;
93 }
因為乙個加號除錯了乙個晚上o(╥﹏╥)o
一天一道演算法題 樹狀陣列
題目 模板 樹狀陣列1 樹狀陣列和線段樹差不多,可以處理區間操作,但是處理不了太複雜的區間問題。不過 比線段樹簡潔很多很多!時間複雜度都為o logn 例如,區間 1,8 儲存方式如下 1 tree 1 num 1 001 001 2 tree 2 num 2 num 1 010 010 001 3...
一天一道演算法題 5 24 遞迴
我們每一天都應該比昨天更強一點 觀察下列式子 12 12 1 12 6 2 12 4 3 12 3 4 12 3 2 2 12 2 6 12 2 3 2 12 2 2 3 對於給定的n 計算n公有多少種不同的分解式?1 include 2 using namespace std 34 int cnt...
一天一道演算法題 之動態規劃
最近做了幾道動態規劃題,發現了其中一些規律,認真覆盤一下。先來看幾道題。1 機械人走方格 有乙個xxy的網格,乙個機械人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計乙個演算法,計算機械人有多少種走法。注意網格中有些障礙點是不能走的。給定乙個intmap c 中為vector 表示網格圖...