小l正在組織acm暑假集訓,但眾所周知,暑假集訓的萌新中有oi神犇,也有暑假才開始學演算法的萌新,如果統一集訓的難度,無法很好地讓萌新們得到訓練,所以小l想了乙個辦法,根據每次測試的情況,改變萌新們的集訓難度。現在將萌新們編號為1到n,最初萌新們的集訓難度為v0,測試後有兩種操作,第一種是某一區間的萌新的集訓難度同時提高,另一種是將某一段區間的萌新的集訓難度變為同乙個數,同時,wells希望在某次調整難度之後,知道某一段區間的萌新的集訓難度之和,由於小l比較鶸,他並不知道如何快速解決這個問題,你能幫幫他嘛?
input
第一行三個數n,m,v0 表示有n名萌新和m次調整,初始時全部萌新的集訓難度都為v0
第2~m+1行 每行三個數或四個數
0 x y v 表示把 [x,y]區間內的萌新的集訓難度都增加v
1 x y v 表示把 [x,y]區間內的萌新的集訓難度都變為v
2 x y表示詢問[x,y]區間內萌新的集訓難度之和
0output
每個詢問一行,輸出答案
sample input
3 5 0
0 1 3 1
1 2 3 2
2 1 1
2 2 2
2 2 3
sample output
1
24
hint
#include#include#define n 100001
using namespace std;
int n,m,x,y;
long long z,val,ans;
struct node
tree[n<<2];
void build(int k,int l,int r)
int mid=l+r>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
tree[k].sum=tree[k<<1].sum+tree[k<<1|1].sum;
}void pushup(int k)
void pushdown_set(int k)
void pushdown_add(int k)
void set(int k,int l,int r,long long z)//區間修改為某個值
if(tree[k].v) pushdown_set(k);
if(tree[k].add) pushdown_add(k);
int mid=tree[k].l+tree[k].r>>1;
if(l<=mid) set(k<<1,l,r,z);
if(r>mid) set(k<<1|1,l,r,z);
pushup(k);
}void add(int k,int l,int r,long long z)//區間加上某個值
if(tree[k].v) pushdown_set(k);
if(tree[k].add) pushdown_add(k);
int mid=tree[k].l+tree[k].r>>1;
if(l<=mid) add(k<<1,l,r,z);
if(r>mid) add(k<<1|1,l,r,z);
pushup(k);
} void query(int k,int l,int r)
if(tree[k].v) pushdown_set(k);
if(tree[k].add) pushdown_add(k);
int mid=tree[k].l+tree[k].r>>1;
if(l<=mid) query(k<<1,l,r);
if(r>mid) query(k<<1|1,l,r);
}int main()
else if(temp==1)
else}}
CSU OJ2151 集訓難度
小l正在組織acm暑假集訓,但眾所周知,暑假集訓的萌新中有oi神犇,也有暑假才開始學演算法的萌新,如果統一集訓的難度,無法很好地讓萌新們得到訓練,所以小l想了乙個辦法,根據每次測試的情況,改變萌新們的集訓難度。現在將萌新們編號為1到n,最初萌新們的集訓難度為v0,測試後有兩種操作,第一種是某一區間的...
集訓 Tire 線段樹
訓練題目位址 virtual judge problem a uva 11488 字典樹問題 view source on github problem b hdu 1251 字典樹 view source on github problem c hdu 1247 字典樹 view source o...
集訓 DP 搜尋 線段樹
集訓contest位址 vj private contest 128411 problem a poj 1018 剛開始非常缺乏思路,後來聽大家的討論再研究一下發現這道題可以暴力列舉a的。需要注意的是 f和 lf的問題。其實這個鍋不能給c g 編譯器,怪就怪當年的c標準委員會。double本來就應該...