線段樹部分操作

2021-08-05 22:09:02 字數 948 閱讀 1179

sys學長 ←orz

typedef

long

long ll;

const

int maxx=1e5+2;

//結構體維護區間資訊:區間左端點,區間右端點,區間維護的值

struct tree

t[maxx<<1];

int a[maxx];

//建樹

void updata(int n)//更新資訊

void build(int l,int r,int n)

//遞迴處理兒子

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

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

updata(n);//回溯更新資訊

}//查詢區間和

ll ask_sum(int n,int l,int r)

//單點修改:從根節點找到葉子節點,修改葉子節點的值,回溯時更新即可。

void change(int n,int p,int x)

if(p<=t[n].l+t[n].r)

chane(n<<1,l,r,s);

else

change(n<<1|1,l,r,s);

updata(n);

}//區間修改:需打標記add (查詢的時候也要記得下放標記!)

void addp(int n,int x)

void spread(int n) }

void add(int n,int l,int r,ll x)

int m=(t[n].l+t[n].r)>>1;

spread(n);

if(l<=m) add(l,r,n<<1,x);

if(r>m) add(l,r,n<<1|1,x);

updata(n);

}int main()

(線段樹操作)

題意 選取a序列的一段 l,r 將選中的區間按非降排序。問能否經過若干次操作後形成b序列 分析 b序列的數的總類及各個類的數目一定要與a序列相同 對b的每個位置的值,找到與之相同的a序列中還沒有被用的位置nowpos,然後判斷1到nowpos的最小值是否等於b序列的當前值,再將該位置修改為無效值 若...

線段樹 數列操作

假設有一列數 1 i n 支援如下兩種操作 1 將 ak 的值加 d k,d 是輸入的數 2 輸出 as as 1 at s,t 都是輸入的數,s t 根據操作要求進行正確操作並輸出結果。輸入格式 輸入檔案第一行乙個整數n 0 n 100000 第二行為 n 個整數,表示 的初始值。第三行為乙個整數...

操作格仔 線段樹

問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m。接下來一行n個整數表示n個格仔的初始權值。接下來m行,每行3個整數p...