題目有了一些變化:查詢區間的總和;將區間內的值都修改為指定值。
因此可以對之前的**進行修改,當修改的時候,修改所有被影響到的節點。但是這樣做會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,你能不能對於每乙個我給出的字串,都在這個詞典裡面找到以這個字串開頭的所有單詞呢?身經百戰的小...