題意:區間有三種二進位制操作,區間中的值不超過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競...