最小生成樹 找最小值 區間 運算修改

2021-08-17 10:24:14 字數 2276 閱讀 3912

you are given an array ofnintegers. you should support the following queries on this array.

first line of the input contains two space separated integersnandq.

second line containsninteger numbers denoting arraya.

in the nextqlines, each contain one of the queries described above.

for each query of the type0, output a single line containing the answer of the query.

input:5 5

1 5 2 3 4

0 2 5

1 1 5 6

0 2 2

1 2 5 3

0 1 3

output:2

40

****為什麼要引用線段樹的理由需要想清楚,因為資料量太大,區間更新會超時,再區間找出最小值會超時!!!!這才是引用線段樹的重要理由,因此下面利用 | (或運算)來尋找區間是否要修改的原因就是,如果對於每乙個值都要去修改,那麼一定會超時,所以才需要利用.st來儲存區間是否與x的&運算有效,如果無效即直接返回,不需要遞迴到區間每乙個值,那麼時間複雜度將會大大減少,如果有效,那麼找出需要修改的區間,再進一步遞迴找出需要修改的值。

綜上所訴,需要利用.st的原因就是來減少時間複雜度的——這個問題我想了很久,如果把

if(a<=l&&r<=b)

注釋掉,那麼直接tle.

找最小值利用線段樹不難,難的在於對&運算理解這題目是利用歸併然後與x值對比,如果可以修改,則繼續找到最後的可以修改的區間,這樣說可能會有點抽象

首先我們可以發現&運算是不可逆的

就是說 假設要&的這個x 某一位是0

他對乙個區間的每乙個數的這一位進行了&0的操作 那麼這一位就永遠是0了

這樣我們可以發現 乙個數真正有意義被&的次數其實最多是含有的1的個數次

如果這個x對這個區間有效 也就是說可以使得1減少那麼就暴力遞迴搞 (線段樹)

如何記錄x對這個區間有效呢 我們只要記錄這個區間 還有哪些位是1就好了

引用別人的一段話
#include #include #include #define l o<<1

#define r o<<1|1

using namespace std;

struct node

m[4000000];

void pushup(int o)

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

int mid=(l+r)/2;

build(l,l,mid);

build(r,mid+1,r);

pushup(o);

}long long query(int o,int l,int r,int a,int b)

int mid=(l+r)/2;

long long t=100000000001;

if(a<=mid)t=min(t,query(l,l,mid,a,b));

if(b>mid) t=min(t,query(r,mid+1,r,a,b));

return t;

}void update(int o,int l,int r,int a,int b,int x)

if(l==r)

int mid=(l+r)/2;

if(a<=mid) update(l,l,mid,a,b,x);

if(b>mid) update(r,mid+1,r,a,b,x);

pushup(o);

}int main()

else}}

}

先上**,最難理解的是m[o].st=m[l].st | m[r].st相當於對l,r進行歸併將他們的所有含有1的位數全部歸併到m[o].st上,因此如果x & m[o].st沒有變化,也就是說,對區間所有元素都不需要修改,則返回,這一點理解了**看起來也就比較輕鬆了

I 修改 最小生成樹

思路 我們可以通過差分思想來解決 對於乙個n個數的序列,我們再給他定義乙個n 1的位置,將其值置為0 那麼,我們的任務就是將前n位數字都置為0 前n位數一開始是任意的 假如給出這樣乙個操作 l,r,w,那麼就a l 就可以跟a r 1 相等 可以理解位 l定點向r定點建邊 那麼,我們的任務就是,將所...

UVa1395 最小值最小生成樹 並查集

思路 用結構體儲存一條邊的資訊 u,v,w 因為是求最小的生成樹,所以把邊排序後,從最小的邊 起點 依次列舉可以構成的生成樹 ac原始碼 include include include include using namespace std const int inf 1 30 int n,m,mi...

GalaxyOJ 727 線段樹區間最小值

problem description wzj同學熟悉電腦操作,於是他找了乙個打字員的工作。他的工作主要是編輯乙個有n行的文字,每一行的字元數量不盡相同。如我們所知的一樣,文字中有乙個游標,它一開始在第1行的最後乙個字元後面,wzj可以在游標的位置輸入或刪除字元。當然,他也可以用方向鍵移動游標,可以...