hiho一下 第二十周 線段樹的區間修改

2021-07-11 03:46:17 字數 1551 閱讀 3615

題目有了一些變化:查詢區間的總和;將區間內的值都修改為指定值。

因此可以對之前的**進行修改,當修改的時候,修改所有被影響到的節點。但是這樣做會tle,題目中給出了提示,修改的時候,如果搜到了符合條件的區間,本應該繼續向下修改,但是我們不往下搜了,用乙個lazytag來標記這個節點,等到以後要用它的子節點的時候,再用lazytag更新左右孩子節點,這樣就會節省時間。

tle**:

#include int st[2097152];//最多2^21-1個節點,注意不是2*n-1個節點,[0]不用

int n, a, b;

int query()

if(l&1)

if((r&1) == 0)

l >>= 1;

r >>= 1;

} return sum;

}void update()

l >>= 1;

r >>= 1;

while(l)

l >>= 1;

r >>= 1; }}

int main()

for(i = a+n, b = a << 1; i < b; i++)

//build segment tree

for(i = a-1; i; i--)

scanf("%d", &q);

while(q--)else

} return 0;

}

ac**:

#include #include #define max_n 100000  

typedef struct nodenode;

node* creat(int i, int j)else

p -> lazytag = -1;

return p;

}

//深度搜尋並更新

void adjust(node *p, int l, int r, int i, int j, int v)

int mid = (l+r)/2, temp;

if(p -> lazytag != -1)

if(j <= mid)else if(i > mid)else

p -> value = p -> left -> value + p -> right -> value;

}

int query(node* p, int l, int r, int i, int j)

int mid = (l + r)/2;

if(p -> lazytag != -1)

if(j <= mid)

if(i >= mid + 1)

return query(p -> left, l, mid, i, mid) + query(p -> right, mid+1, r, mid + 1, j);

}

int main()else

} return 0;

}

hiho 學習日記 hiho一下第二十八周 (堆)

堆的形狀是乙個完全二叉樹,對於最大堆任意根的權值大於左右孩子的權值,而最小堆的任意根的權值小於左右孩子的權值 這裡演示的是最大堆 當插入乙個值的時候,把這個值新增到堆尾中,然後向上調整 voidup int p heap p a void insert int a 刪除堆頂的值的時候,把堆尾的元素賦...

hiho一下 第六十周

給定只包含字母的兩個字串a,b,求a,b兩個字串的最長公共子串行,要求構成子串行的子串長度都必須大於等於3。比如 abcdefghijklmn 和 ababceghjklmn 其最長滿足題意要求的子串行為 abcjklmn 其由公共子串 abc 和 jklmn 組成。這裡我們要注意子串和子串行的區別...

hiho一下第二週 Trie樹

小hi和小ho是一對好朋友,出生在資訊化社會的他們對程式設計產生了莫大的興趣,他們約定好互相幫助,在程式設計的學習道路上一同前進。這一天,他們遇到了一本詞典,於是小hi就向小ho提出了那個經典的問題 小ho,你能不能對於每乙個我給出的字串,都在這個詞典裡面找到以這個字串開頭的所有單詞呢?身經百戰的小...