fzu 2105 線段樹區間更新

2021-09-13 18:09:20 字數 1025 閱讀 5881

題意:區間有三種二進位制操作,區間中的值不超過16,然後查詢區間和。因為每個數很小,所以區間內存在大量重複值,並且經過二進位制操作後區間中相等的值會越來越多。我們只需要記錄當前區間中的值是否相等即可。

#include #include #include #include using namespace std;

int tree[1000000*4];

int a[1000000];

void push_down(int l,int r,int k)

}void build(int l,int r,int k)

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

build(l,mid,k<<1);

build(mid+1,r,k<<1|1);

push_down(l,r,k);

}void update(int l,int r,int l,int r,int k,int flag,int val)

if(tree[k]>=0) //下傳標記

if(l<=mid) update(l,mid,l,r,k<<1,flag,val);

if(r>mid) update(mid+1,r,l,r,k<<1|1,flag,val);

push_down(l,r,k);//上傳標記

}int query(int l,int r,int l,int r,int k)

if(tree[k]>=0) //下傳標記

if(l<=mid)

ans+=query(l,mid,l,r,k<<1);

if(r>mid)

ans+=query(mid+1,r,l,r,k<<1|1);

push_down(l,r,k);//上傳標記

return ans;

}int main()

else if(s[0]=='x')

else if(s[0]=='o')

else

} }

return 0;

}

線段樹區間更新

在此我們之前學習了線段樹的單點更新 點我 但是現在我們遇到乙個這樣的問題 給出乙個n個元素的陣列a1,a2,an。我們總共進行m次操作。每次操作為下列兩種操作其中一種 1 add l,r,v 將a l a l 1 a r 的值全部增加v。2 query l,r 計算子串行a l a l 1 a r ...

線段樹(區間更新求和)

poj 3468 include using namespace std define max 100100 struct node 求區間長度 int get dis node tree max 3 long long d max 建樹 long long build int left,int r...

線段樹之區間更新

為什麼這樣?答案是顯然的。線段樹的查詢和單點更新的時間複雜度是o logn 的,如果我每次都只是更新乙個節點,再去詢問,那麼複雜度是o nlogn 這個複雜度是可以接受的,但是如果每次操作我都是更新乙個區間,還是用單點更新去做,那麼複雜度是o n 2logn 這個複雜度是很大的,一般來說,在acm競...