数据结构:差分数组
差分数组不仅仅是一个优秀的数据结构,还是一种很好的思想
差分数组的功能是修改区间,查询点
修改区间的时间复杂度是O(1),查询点的时间复杂度为O(n)
我们这里要根据数据范围灵活选取方法,不要拘泥于差分数组
void update(int x,int y,int z) { b[x]+=z; b[y+1]-=z; }
以上是修改区间操作,x位置加上修改量,y+1位置减去修改量,这样整个区间的元素就相当于修改了
int sum(int x) { int ans=0; for(int i=1;i<=x;i++) ans+=b[i]; return ans; }
刚才方便了,但是查询的时候就需要全部都加一遍了
还有就是预处理的时候
b[1]=a[1]; for(int i=2;i<=n;i++) b[i]=a[i]-a[i-1];
下面给出有一个完整的实现代码:
1 //aininot260 2 //修改区间,查询点 3 #include<iostream> 4 #include<cstring> 5 using namespace std; 6 const int maxn=100005; 7 const int maxq=100005; 8 int a[maxn]; 9 int b[maxn]; 10 int n,q; 11 void update(int x,int y,int z) 12 { 13 b[x]+=z; 14 b[y+1]-=z; 15 } 16 int sum(int x) 17 { 18 int ans=0; 19 for(int i=1;i<=x;i++) 20 ans+=b[i]; 21 return ans; 22 } 23 int main() 24 { 25 cin>>n; 26 for(int i=1;i<=n;i++) 27 cin>>a[i]; 28 b[1]=a[1]; 29 for(int i=2;i<=n;i++) 30 b[i]=a[i]-a[i-1]; 31 cin>>q; 32 while(q--) 33 { 34 int x; 35 cin>>x; 36 if(x==1) 37 { 38 int y,z,w; 39 cin>>y>>z>>w; 40 update(y,z,w); 41 } 42 if(x==2) 43 { 44 int y; 45 cin>>y; 46 cout<<sum(y)<<endl; 47 } 48 } 49 return 0; 50 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
· C# 开发工具Visual Studio 介绍
· 在 Windows 10 上实现免密码 SSH 登录
· C#中如何使用异步编程