這次是把某個區間全部更新為乙個值,而不是增加或減少。最後詢問一下區間總和。
思路還是差不多的。在更新時,當我們將乙個節點所維護的區間更新後,可以用這個區間的長度*新的值,即
tree[x].sum = (tree[x].r-tree[x].l+1)*tree[x].data。
在查詢或更新區間時,可以將tree[x].data作為懶惰標記繼續往下傳,最後完成push_up操作:
tree[x].sum = tree[x<<1].sum+tree[x<<1|1].sum;
#include#include#include#includeconst int maxn = 100000+5;
using namespace std;
int t,n,q,x,y,z;
struct node
}tree[maxn*4];
void getsum(int x)
void push_down(int x)
}void build(int x,int l,int r)
else
}void update(int x,int l,int r,int z)
else
}long long query(int x,int l,int r)
return ans;
}int main()
// for(int i=1;i<=n;i++)
// cout
} return 0;
}
Splay解決區間問題 區間更新,區間求和
區間更新,區間求和 注意各種編碼細節,特別是splay buildtree和 rotateto 仔細體會與線段樹解決區間問題的不同點,如結點記錄的資訊是不同的 lazy思想 include include includeusing namespace std const int maxn 11111...
hdu 1698 區間更新
基礎題 初學 include include using namespace std define lson l m rt 1 define rson m 1 r rt 1 1 const int maxn 101000 int h w n int col maxn 2 標記是否當前節點梗係 int...
hdu1698 區間更新
初寫線段樹的時候,印象最深的一道,有乙個pushdown的操作,使我的tle變成了ac 題意輸入t,然後t組資料 輸入n,m,n代表n個點上價值全是1的繩子,m代表m次操作 m行l,r,val 就是區間l,r變成val 求最後繩子總共價值 思路線段樹,懶人標記 include include inc...