#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,...