分块维护和板子

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
using ll = long long;
ll s[N];
ll b[N];
ll w[N];
ll add[N];
int l[N],r[N];
int tot,n,len,q;
int belong[N];


inline void init()
{
	len = sqrt(n),tot = (n+len-1)/len;
	for(int i=1;i<=tot;i++)
	 l[i] = r[i-1]+1,r[i] = i*len;
	 
	for(int i=1;i<=tot;i++){
		for(int j=l[i];j<=r[i];j++)
		 b[i]+=w[j],belong[j] = i;
		s[i] = s[i-1] + b[i];
	}
	
}

inline void modify(int ql,int qr,int c){
	int p = belong[ql],q = belong[qr];
	if(p==q){
		for(int i=ql;i<=qr;i++)w[i]+=c,b[p]+=c;
		for(int i=p;i<=tot;i++)s[i] = s[i-1]+b[i];
		return;
	}
	
	for(int i=ql;i<=r[p];i++)w[i]+=c,b[p]+=c;
	for(int i=qr;i>=l[q];--i)w[i]+=c,b[q]+=c;
	for(int i=p+1;i<=q-1;i++)add[i]+=c,b[i]+=(ll)(r[i]-l[i]+1)*c;
	
	for(int i=p;i<=tot;i++)s[i] = s[i-1]+b[i];
}



inline ll query(int ql,int qr){
	int p = belong[ql],q = belong[qr];
	ll res = 0;
	if(p==q){
		for(int i=ql;i<=qr;i++)res+=w[i]+add[p];
		return res;
	}
	
	res = s[q-1]-s[p];
	for(int i=ql;i<=r[p];++i)res+=w[i]+add[p];
	for(int i=qr;i>=l[q];--i)res+=w[i]+add[q];
	return res;
}



int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>w[i];
	init();
	while(q--){
		int op,ql,qr;cin>>op>>ql>>qr;
		if(op==1){
			int c;
			cin>>c;modify(ql,qr,c);
		}
		else cout<<query(ql,qr)<<"\n";
	}
}
相关推荐
星迹日1 小时前
数据结构:二叉树—面试题(二)
java·数据结构·笔记·二叉树·面试题
迪小莫学AI2 小时前
【力扣每日一题】LeetCode 2412: 完成所有交易的初始最少钱数
算法·leetcode·职场和发展
c++初学者ABC2 小时前
蓝桥杯LQ1044 求完数
c++·算法·lq蓝桥杯
星迹日2 小时前
数据结构:二叉树—面试题(一)
数据结构·经验分享·笔记·二叉树·面试题
.zhy.3 小时前
《挑战程序设计竞赛2 算法和数据结构》第二章实现
java·数据结构·算法
Catherinemin3 小时前
剑指Offer|LCR 045.找树左下角的值
javascript·算法
_GR3 小时前
2013年蓝桥杯第四届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·蓝桥杯
记得早睡~4 小时前
leetcode28-找出字符串中第一个匹配的下标
数据结构·算法·leetcode
zfj3214 小时前
学技术学英语: 数据结构 - Elasticsearch BKD tree
数据结构·elasticsearch·bkd
KpLn_HJL4 小时前
leetcode - 802. Find Eventual Safe States
算法·leetcode·职场和发展