線段樹成段更新 MB

2021-06-14 12:42:24 字數 981 閱讀 4308

#include #include using namespace std;  

struct node

a[4*1100000];

int dp[1100000],n,m;

long long max(long long int x,long long int y)

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

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

build(l,mid,ans*2);

build(mid+1,r,ans*2+1);

a[ans].v=a[ans*2].v+a[ans*2+1].v;

} long long query(int l,int r,int ans)

void insert(int l,int r,long long x,int ans)

int mid=(a[ans].l+a[ans].r)>>1;

a[ans*2].add+=(mid-a[ans].l+1)*(a[ans].add/(a[ans].r-a[ans].l+1));

a[ans*2+1].add+=(a[ans].r-mid)*(a[ans].add/(a[ans].r-a[ans].l+1));

a[ans].add=0;

if(l>=mid+1) insert(l,r,x,ans*2+1);

else if(r<=mid) insert(l,r,x,ans*2);

else

a[ans].v=a[ans*2].v+a[ans*2].add+a[ans*2+1].v+a[ans*2+1].add;

} int main()

build(1,n,1);

while(m--)

else

} return 0;

}

線段樹(單點更新and成段更新)

線段樹需要的空間。區間為1 n 假設是一棵完全二叉樹,且樹高為i。完全二叉樹性質 第i層最多有2 i 1 個結點。那麼 2 i 1 n i log2 n 1 共有 2 i 1 個結點,即 2 log2 n 1 1個結點 即2 2 log2 n 1 2 n 1 但這是建立樹是完全二叉樹的情況下。但是如...

Just a Hook(線段樹,成段更新)

題目傳送門 just a hook t組資料 每組有乙個長度為n的序列,給你m次操作,每次操作給你x,y,z三個數,操作 將x到y的數字變為z m次操作完成後求序列的總和 很明顯的線段樹題目,維護區間和即可 注意一下更新區間的方法即可 對於修改不能直接更新到底部,要成段更新 include usin...

線段樹成段更新之延遲更新

成段更新的重點是延遲更新,以區間 1,3 為例說明。注意,此例中 更新 為修改元素的值為a,查詢 為求區間中所有元素之和。建立二叉樹如圖示 每乙個圓圈代表乙個結點,圓內數字分別為結點標號和所對應區間,i 表示只含乙個數,只出現在葉節點中。當 要更新區間 1,2 中所有元素時,對應上圖即要更新結點4,...