https://ac.nowcoder.com/acm/contest/895/Ghtml
第一行包含兩個整數n,q(1≤n,q≤100000)n,q(1≤n,q≤100000),分別表示序列長度爲以及操做次數,ios
接下來 q 行,每行第一個數字表示操做類型,接下來輸入對應題面描述。c++
對於每一個操做 2,輸出對應查詢的結果。
5 5 0 0 0 0 0 2 1 1 1 5 2 -1 2 5 1 1 2 -1 2 2 1
0 -2 -1
咱們能夠把(i-L)*Y+X 當作 i*Y-L*Y+X,這樣的話-L*Y+X就是一個常數。由於|Y|<=5,因此咱們能夠開11個線段樹分別存Y的狀況,這樣查詢的時候就很方便了ide
寫push_down函數的時候要注意下,要保留最小值,否則可能會出現以下狀況:函數
區間5-10更新最小值爲5,而後區間1-10更新最小值爲10,這樣當區間1-10下推的時候就把區間5-10給覆蓋了spa
1 #include<bits/stdc++.h> 2 #define lson l,mid,rt<<1 3 #define rson mid+1,r,rt<<1|1 4 typedef long long ll; 5 #define maxn 100005 6 using namespace std; 7 8 int Tree[15][maxn<<2]; 9 int Lazy[15][maxn<<2]; 10 int a[maxn]; 11 12 int n,q; 13 14 void push_down(int tree[],int lazy[],int rt){ 15 if(lazy[rt]!=0x3f3f3f3f){ 16 lazy[rt<<1]=min(lazy[rt<<1],lazy[rt]); 17 lazy[rt<<1|1]=min(lazy[rt<<1|1],lazy[rt]); 18 tree[rt<<1]=min(tree[rt<<1],lazy[rt]); 19 tree[rt<<1|1]=min(tree[rt<<1|1],lazy[rt]); 20 lazy[rt]=0x3f3f3f3f; 21 } 22 } 23 24 void add(int tree[],int lazy[],int L,int R,int v,int l,int r,int rt){ 25 if(L<=l&&R>=r){ 26 tree[rt]=min(tree[rt],v); 27 lazy[rt]=tree[rt]; 28 return; 29 } 30 push_down(tree,lazy,rt); 31 int mid=l+r>>1; 32 if(L<=mid) add(tree,lazy,L,R,v,lson); 33 if(R>mid) add(tree,lazy,L,R,v,rson); 34 } 35 36 int query(int tree[],int lazy[],int L,int l,int r,int rt){ 37 if(l==r){ 38 return tree[rt]; 39 } 40 push_down(tree,lazy,rt); 41 int mid=l+r>>1; 42 if(L<=mid) return query(tree,lazy,L,lson); 43 return query(tree,lazy,L,rson); 44 } 45 46 int main(){ 47 std::ios::sync_with_stdio(false); 48 cin>>n>>q; 49 for(int i=1;i<=n;i++){ 50 cin>>a[i]; 51 } 52 for(int i=0;i<15;i++){ 53 for(int j=0;j<(maxn<<2);j++){ 54 Tree[i][j]=0x3f3f3f3f; 55 Lazy[i][j]=0x3f3f3f3f; 56 } 57 } 58 int pos,L,R,x,y; 59 while(q--){ 60 cin>>pos; 61 if(pos==1){ 62 cin>>L>>R>>x>>y; 63 add(Tree[y+5],Lazy[y+5],L,R,-L*y+x,1,n,1); 64 } 65 else{ 66 cin>>x; 67 int ans=a[x]; 68 for(int i=0;i<=10;i++){ 69 ans=min(ans,(i-5)*x+query(Tree[i],Lazy[i],x,1,n,1)); 70 } 71 cout<<ans<<endl; 72 } 73 } 74 }