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...