區間問題筆記

2021-08-28 18:59:32 字數 3114 閱讀 7089

成段修改rmq

成段修改rmq

注意update裡面val和lazy都要加 因為val一定會變 然後我們在這裡沒有pushdown所以兒子們還沒有處理

#include #include #include using namespace std;

const int n=1e5+20;

inline int lson(int x)

inline int rson(int x)

struct nodesegtree[n<<2];

int a[n];

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

int mid=(l+r)>>1;

build(lson(t),l,mid);

build(rson(t),mid+1,r);

segtree[t].val=max(segtree[lson(t)].val,segtree[rson(t)].val);

}void pushdown(int t,int l,int r)

void update(int t,int l,int r,int s,int e,int c)

pushdown(t,l,r);

int mid=(l+r)>>1;

update(lson(t),l,mid,s,e,c);

update(rson(t),mid+1,r,s,e,c);

segtree[t].val=max(segtree[lson(t)].val,segtree[rson(t)].val);

}int query(int t,int l,int r,int s,int e)

pushdown(t,l,r);

int mid=(l+r)>>1;

return max(query(lson(t),l,mid,s,e),query(rson(t),mid+1,r,s,e));

}int main()

else}}

return 0;

}

成段修改區間和

成段修改區間和

先放乙個wa和tle的 wa是因為沒有想清楚不打lazy的時候不用pushdown但是其實實際上是需要修改兒子的 tle是因為把每次操作都做到底了 做完了就突然更明白了lazy的意義

#include #include #include using namespace std;

const int n=1e5+20;

inline int lson(int x)

inline int rson(int x)

int segtree[n<<2];

int a[n];

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

int mid=(l+r)>>1;

build(lson(t),l,mid);

build(rson(t),mid+1,r);

segtree[t]=segtree[lson(t)]+segtree[rson(t)];

}void pushdown(int t,int l,int r,int c)

void update(int t,int l,int r,int s,int e,int c)

// pushdown(t,l,r,c);

int mid=(l+r)>>1;

update(lson(t),l,mid,s,e,c);

update(rson(t),mid+1,r,s,e,c);

segtree[t]=segtree[lson(t)]+segtree[rson(t)];

}int query(int t,int l,int r,int s,int e)

// pushdown(t,l,r);

int mid=(l+r)>>1;

return query(lson(t),l,mid,s,e)+query(rson(t),mid+1,r,s,e);

}int main()

else}}

return 0;

}

ac的如下

中間又得到了一些經驗

1.不要全換long long 所有運算的速度都會慢 所以又會tle

2.%d%lld 輸入兩個int 第二個輸入會是0

#include #include #include #define ll long long

using namespace std;

const int n=1e5+20;

inline int lson(int x)

inline int rson(int x)

struct nodesegtree[n<<2];

ll a[n];

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

int mid=(l+r)>>1;

build(lson(t),l,mid);

build(rson(t),mid+1,r);

segtree[t].val=segtree[lson(t)].val+segtree[rson(t)].val;

}void pushdown(int t,int l,int r)

void update(int t,int l,int r,int s,int e,ll c)

pushdown(t,l,r);

int mid=(l+r)>>1;

update(lson(t),l,mid,s,e,c);

update(rson(t),mid+1,r,s,e,c);

segtree[t].val=segtree[lson(t)].val+segtree[rson(t)].val;

}ll query(int t,int l,int r,int s,int e)

pushdown(t,l,r);

int mid=(l+r)>>1;

return query(lson(t),l,mid,s,e)+query(rson(t),mid+1,r,s,e);

}int main()

else}}

return 0;

}

筆記 RMQ區間極值問題

專題 區間最小 最大查詢 range minimum maximum query rmq問題 描述 已知長度為l的數列a,詢問區間 l,r 中的最值。若詢問的次數較少,可以用線性的複雜度來查詢,但如果詢問的次數過多且l過大,那麼複雜度就會很高。所以需要更快速的查詢方法。st演算法 預處理o nlog...

區間問題 區間選點 區間問題 貪心

玄學的貪心問題,一般全憑直覺。貪心問題沒有固定討論,沒有模板,見多了就好了,證明想法的正確性是很困難的,大多採用反證法。905.區間選點 貪心思路 證明 時間複雜度 o n logn o nlogn o nlog n include include using namespace std const...

區間貪心問題小結(區間選點,區間覆蓋,區間選取)

貪心演算法 思想 什麼是貪心演算法,什麼算得上是貪心 貪心演算法 又稱貪婪演算法 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性...