Qt QSS QSlider樣式
阿新 • • 發佈:2020-08-28
超高校級的毒瘤碼風
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1000010; int n,m; ll arr[N]; ll tree[N<<2]={0};//四倍於原陣列 ll lazy[N<<2];//lazy tag /*懶標記下傳函式*/ inline void func(ll node,ll l,ll r,ll k) { lazy[node]=lazy[node]+k; tree[node]=tree[node]+k*(r-l+1);//區間統一改變,所以要加上區間總變化量,下同 } inline void push_down(int node,int l,int r) { if(!lazy[node]) return ; ll mid=(l+r)>>1; int left_node=node<<1; int right_node=(node<<1)|1; if(lazy[node]==0) return ; func(left_node,l,mid,lazy[node]); func(right_node,mid+1,r,lazy[node]); lazy[node]=0;//tag推掉了,歸零 } /*建樹函式*/ void build_tree(int node/*節點編號*/,int start/*區間起點*/,int end/*區間終點*/) { lazy[node]=0; if(start==end)//遞迴出口:當區間無法繼續細分 { tree[node]=arr[start]; return ; } int mid=(start+end)>>1; int left_node=node<<1; int right_node=(node<<1)|1; build_tree(left_node,start,mid); build_tree(right_node,mid+1,end); tree[node]=tree[left_node]+tree[right_node];//維護線段樹 } /*區間修改函式*/ void update_itv(int node,int start,int end,int l/*修改區間左端點*/,int r/*修改區間右端點*/,ll vol/*運算元(加上的數)*/) { if(l<=start&&end<=r) { // cout<<start<<'#'<<end<<endl; tree[node]+=vol*(end-start+1); lazy[node]+=vol;//打懶標記 return ; } push_down(node,start,end); /*需要向下推 懶標記*/ int mid=start+end>>1; int left_node=node*2; int right_node=(node*2)+1; if(l<=mid) update_itv(left_node,start,mid,l,r,vol); if(r>mid) update_itv(right_node,mid+1,end,l,r,vol); tree[node]=tree[left_node]+tree[right_node];//維護 } /*區間查詢函式*/ ll query(int node,int start,int end,int l/*查詢區間起點*/,int r/*查詢區間終點*/) { if(end<l||start>r) return 0;//不在計算範圍內 if(l<=start&&end<=r) return tree[node];//當前區間被包含 int mid=start+end>>1; push_down(node,start,end);//推lazy int left_node=node*2; int right_node=(node*2)|1; ll sum_left=query(left_node,start,mid,l,r); ll sum_right=query(right_node,mid+1,end,l,r); return sum_left+sum_right;//維護 } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%lld",&arr[i]); } build_tree(1,1,n); for(int i=1;i<=m;i++) { int k,x,y,z; scanf("%d",&k); if(k==1) { scanf("%d%d%d",&x,&y,&z); if(x>y) swap(x,y); update_itv(1,1,n,x,y,z); // cout<< } else { scanf("%d%d",&x,&y); if(x>y) swap(x,y); printf("%lld\n",query(1,1,n,x,y)); } } }