1. 程式人生 > 實用技巧 >Qt QSS QSlider樣式

Qt QSS QSlider樣式

超高校級的毒瘤碼風

#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));
		}
	}
}