op = 1 sum
op = 2 sum2 平方和
op = 3 *mul
op = 4 +add
2個lazy標記
#include #include using namespace std;
#define lc (rt << 1)
#define rc (rt << 1 | 1)
#define mid (l + r) / 2
typedef long long ll;
const int maxn = 1e4 + 5;
ll a[maxn];
ll sum[maxn << 2],sum2[maxn << 2];
ll _sum,_sum2;
ll mul[maxn << 2];
ll add[maxn << 2];
void init(int l,int r,int rt)
init(l,mid,lc);
init(mid + 1,r,rc);
sum[rt] = sum[lc] + sum[rc];
sum2[rt] = sum2[lc] + sum2[rc];
mul[rt] = 1;
add[rt] = 0;
}//一定要先更新sum2,因為它用到了舊的sum
//如果2個標記分開處理,先確定順序,第乙個標記除了update中操作,還更新d第二個標記;第二個標記就是update操作
void pushdown(int l,int r,int rt)
if(add[rt] != 0)
}//左子樹原x1*a+y1 將父節點傳遞->x*(x1*a+y1)+y
//void pushdown(int l,int r,int rt)
//void query(int ql,int qr,int l,int r,int rt)
pushdown(l,r,rt);
if(ql <= mid) query(ql,qr,l,mid,lc);
if(mid < qr) query(ql,qr,mid + 1,r,rc);
}void update1(int ql,int qr,int l,int r,int rt,ll x)
pushdown(l,r,rt);
if(ql <= mid) update1(ql,qr,l,mid,lc,x );
if(mid < qr) update1(ql,qr,mid + 1,r,rc,x );
sum[rt] = sum[lc] + sum[rc];
sum2[rt] = sum2[lc] + sum2[rc];
}void update2(int ql,int qr,int l,int r,int rt,ll x)
pushdown(l,r,rt);
if(ql <= mid) update2(ql,qr,l,mid,lc,x );
if(mid < qr) update2(ql,qr,mid + 1,r,rc,x );
sum[rt] = sum[lc] + sum[rc];
sum2[rt] = sum2[lc] + sum2[rc];
}int main()
else if(op == 2)
else if(op == 3)
else if(op == 4)
}return 0;
}
牛客練習賽28 B 資料結構
題目描述 qn姐姐最好了 qn姐姐給你了乙個長度為n的序列還有m次操作讓你玩,1 l r 詢問區間 l,r 內的元素和 2 l r 詢問區間 l,r 內的元素的平方和 3 l r x 將區間 l,r 內的每乙個元素都乘上x 4 l r x 將區間 l,r 內的每乙個元素都加上x 第一行兩個數n,m ...
牛客練習賽28 B 複習線段樹 )
description qn姐姐給你了乙個長度為n的序列還有m次操作讓你玩,1 l r 詢問區間 l,r 內的元素和 2 l r 詢問區間 l,r 內的元素的平方和 3 l r x 將區間 l,r 內的每乙個元素都乘上x 4 l r x 將區間 l,r 內的每乙個元素都加上x input n,mop...
《牛客練習賽28 B》
這題主要就是多了乙個平方和的操作。我們維護平方和的值的時候。需要注意在下放的時候,要先把乘法之後的sum1算出來,這對算sum1最終的值沒有影響。但是對sum2的值有影響。因為我們在計算中就在更新adtag的值,所以這個adtag它的sum1應該最終化。includeusing namespace ...