1. 程式人生 > 其它 >sql insert 自動增量值_SQL基礎:第4章練習題

sql insert 自動增量值_SQL基礎:第4章練習題

線段樹是一種二叉搜尋樹,將一個區間化分成多個單元區間,其中樹的每個葉子就是對應的每個單元區間。

基本思想:二分

定義

1 const int maxx=50005;
2 int a[maxx],mx[maxx*4],lazy[maxx*4];
3 //陣列a為原陣列,陣列mx為線段樹維護區間和,陣列lazy為懶惰標記

更新節點資訊

1 void pushup(int rt)
2 {
3     mx[rt]=mx[rt*2]+mx[tr*2+1];
4 }

建立線段樹

 1 void build(int l,int r,int rt)
 2 {
 3     if(l==r)
 4     {
5 mx[rt]=a[l]; 6 return ; 7 } 8 int mid=(l+r)/2; 9 build(l,mid,rt*2); 10 build(mid+1,r,rt*2+1); 11 pushup(rt); 12 }

下推懶惰標記

 1 void pushdown(int k,int l,int r)//l表示左子樹節點個數,r表示右子樹節點個數
 2 {
 3     if(lazy[k])
 4     {
 5         mx[k*2]+=lazy[k]*l;
 6         mx[k*2
+1]+=lazy[k]*r; 7 lazy[k*2]+=lazy[k]; 8 lazy[k*2+1]+=lazy[k]; 9 lazy[k]=0; 10 } 11 }

更新點

 1 void updata(int L,int l,int r,int rt,int val)
 2 {
 3     if(l==r)//到達所要求的點
 4     {
 5         mx[rt]+=val;
 6         return ;
 7     }
 8     int mid=(l+r)/2;
 9     if(L<=mid)//
往上或者往下 10 updata(L,l,mid,rt*2,val); 11 else 12 updata(L,mid+1,r,tr*2+1,val); 13 pushup(rt); 14 }

更新區間

 1 void updata(int L,int l,int r,int rt,int val)
 2 {
 3     if(l==r)//到達所要求的點
 4     {
 5         mx[rt]+=val;
 6         return ;
 7     }
 8     int mid=(l+r)/2;
 9     pushdown(rt,mid-l+1,r-mid);
10     if(L<=mid)//往上或者往下
11         updata(L,l,mid,rt*2,val);
12     else
13         updata(L,mid+1,r,tr*2+1,val);
14     pushup(rt);
15 }

區間查詢

 1 int query(int L,int R,int l,int r,int rt)
 2 {
 3     if(L<=l&&r<=R)//在範圍裡
 4         return mx[rt];
 5     int mid=(l+r)/2;
 6     pushdown(rt,mid-l+1,r-mid);//點更新忽略這個
 7     int ans=0;
 8     if(L<=mid)//可以再往下
 9         ans+=query(L,R,l,mid,rt*2);
10     if(R>mid)//可以再往上
11         ans+=query(L,R,mid+1,rt*2+1);
12     return ans;
13 }

先將模板寫下來,以後再來總結