Wikioi 1081 线段树成段更新单点查询
生活随笔
收集整理的這篇文章主要介紹了
Wikioi 1081 线段树成段更新单点查询
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
線段樹練習(xí)飄逸的寫法,自從自己改成這樣的寫法之后,線段樹就沒再練過,如今最終練得上了。
由于這里查詢僅僅是查詢了葉子結(jié)點(diǎn),所以pushUp函數(shù)就用不上了,只是我沒去掉之前是3ms。去掉之后反而變成4ms了,搞不懂怎么原因,沒用到,去掉之后應(yīng)該更快才對啊,居然變慢了,真搞不明確?
#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #define PI acos(-1.0) #define mem(a,b) memset(a,b,sizeof(a)) #define sca(a) scanf("%d",&a) #define sc(a,b) scanf("%d%d",&a,&b) #define pri(a) printf("%d\n",a) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define MM 100004 #define MN 1008 #define INF 2000000000 #define eps 1e-8 using namespace std; typedef long long ll; typedef unsigned long long ULL; int sum[MM],val[MM]; //void pushUp(int i) //{ // sum[i]=sum[i<<1]+sum[i<<1|1]; //} void pushDown(int i) //處理lazy標(biāo)記 {if(val[i]){val[i<<1]+=val[i],val[i<<1|1]+=val[i];sum[i<<1]+=val[i],sum[i<<1|1]+=val[i];val[i]=0;} } void build(int i,int l,int r) {sum[i]=val[i]=0;if(l==r) return ;int mid=(l+r)>>1;build(lson),build(rson); } void update(int i,int l,int r,int L,int R,int v) {if(L<=l&&r<=R){val[i]+=v;sum[i]+=v;return ;}int mid=(l+r)>>1;pushDown(i);if(L<=mid) update(lson,L,R,v);if(R>mid) update(rson,L,R,v);//pushUp(i); } int query(int i,int l,int r,int x) {if(l==x&&r==x) return sum[i];int mid=(l+r)>>1;pushDown(i);if(x<=mid) return query(lson,x);else return query(rson,x); } int main() {int n,q,mm,i,a,b,s;sca(n);build(1,1,n);for(i=1;i<=n;i++){sca(a);update(1,1,n,i,i,a);}sca(q);while(q--){sca(mm);if(mm==1){scanf("%d%d%d",&a,&b,&s);update(1,1,n,a,b,s);}else{sca(s);pri(query(1,1,n,s));}}return 0; }總結(jié)
以上是生活随笔為你收集整理的Wikioi 1081 线段树成段更新单点查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tomcat部署时没有项目
- 下一篇: c#调用cmd