小H的詢問(線段樹)

2022-08-02 11:18:12 字數 1349 閱讀 9093

線段樹需要維護的:最大有效子區間權值和,左端最大有效子區間權值和,右端最大有效子區間權值和,區間和,本區間有效性。

#include#include

#include

#include

#include

#include

#include

#define maxn 1000005

using

namespace

std;

typedef

long

long

ll;int a[100005

];struct

node

return

res;

}}node[3

00015

];void construct(int l,int r,int

k)

int mid=(l+r)/2

; construct(l,mid,

2*k);

construct(mid+1,r,2*k+1

);

node[k]=node[2*k]+node[2*k+1

];

}struct node query(int k,int x,int

y)

int mid=(l+r)/2

;

struct

node a;

if(x>mid) a=query(2*k+1

,x,y);

else

if(y<=mid) a=query(2*k,x,y);

else a=query(2*k,x,mid)+query(2*k+1,mid+1

,y);

return

a;

}struct node modifiy(int k,int

x,ll num)

int mid=(l+r)/2

;

if(x>mid) node[k]=node[2*k]+modifiy(2*k+1

,x,num);

else

if(x<=mid) node[k]=modifiy(2*k,x,num)+node[2*k+1

];

return

node[k];

}int

main()

else

if(q==1

)

}return0;

}

小C的詢問

小c的詢問 description 小k魔導師得到了乙個序列,這個序列有n個數。他困惑了,小c詢問了它q個問題,他都回答不上來,現在他來請教你。對於每乙個詢問都由一組 l,r 組成,問題是要回答這個區間所有數的和,所有數的與,所有數的或。聰明的你一定能幫助小k回答這些問題。input 輸入第一行為乙...

小B的詢問

這裡不講莫隊的思路,各路大神已經講清楚了。我們講一下如何卡常。把正常的莫隊交上去,記錄。單個點 1784ms 把每一次詢問的右邊界 right i 從小到大改為從打到小,快了了一點。注意要把陣列開小點。1522ms 如果分為 trunc sqrt n 塊不好,然後分別試著分為 n 6 和 n 10 ...

線段樹 小整理

求區間和 ll sum maxn 2 儲存區間和 ll add maxn 2 懶惰標記 ll a maxn 用於輸入儲存資料求區間和的函式 void pushup int x 建立線段樹 void buildtree int l,int r,int rt int m l r 1 buildtree ...