问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

树状数组如何修改区间的值

发布网友 发布时间:2022-04-24 20:53

我来回答

3个回答

热心网友 时间:2022-05-04 21:17

修改区间值可以,但是这样就不能求区间和了(只能求一个点),poj上的matrix是个很好的例子,代码在最后
区间最小值:如果是单端点(从1到r)或者是 双端点(l和r)但是静态的就可以,双端点lg^2 n,原理是区间*近
你也可以在树桩数组里实现lazy-tag,就是不一般的麻烦,我还没调过

Code:(我写麻烦了)
修改整个区间的值(一维度):
#include <cstdio>
#include <cstring>
using namespace std;
int n,c[1000005];
void chg_org(int i,int delta) {
while (i<=n) {
c[i]+=delta;
i+=i&(-i);
}
}
int qry_org(int i) {
int ret=0;
while (i>0) {
ret+=c[i];
i-=i&(-i);
}
return ret;
}
void chg_itvl(int l,int r) {
chg_org(l,1);
chg_org(r+1,-1);
}
int qry_elem(int x) {
return qry_org(x);
}
int main() { //a sample:p2155,1-dimension
scanf("%d",&n);
memset(c,0,sizeof c);
int m,k,xx;
scanf("%d",&m);
for (int i=0;i<m;++i) {
scanf("%d%d",&k,&xx);
if (k>0)
chg_itvl(k,xx);
else
printf("%d\n",qry_elem(xx)%2);
}
return 0;
}

区间最小值:我把它和传统的方在一起了

{
the insert,query_sum function are for sum,they work dynamically.
the prep_rmq,query_min function are for rmq,they work statically only.
}
var
sum:array [1..10000000] of int64;
min:array [1..10000000] of longint;//only static avaliable
a:array [1..10000000] of longint;
n,i,t,m,q1,q2,l,r:longint;
procere insert(i:longint;key:longint);
//only maintain the sum field
var dx:longint;
begin
dx:=key-a[i];
a[i]:=key;
while (i<=n) do
begin
inc(sum[i],dx);
inc(i,i and (-i));
end;
end;
function query_sum(i:longint):int64;
begin
query_sum:=0;
while (i>0) do
begin
inc(query_sum,sum[i]);
dec(i,i and (-i));
end;
end;
function _min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end;
procere prep_rmq;
var
i,k,j:longint;
begin
for i:=1 to n do
begin
min[i]:=a[i];
k:=i and (-i);
j:=1;
while (j<k) do
begin
min[i]:=_min(min[i],min[i-j]);
j:=j shl 1;
end;
end;
end;
function query_min(l,r:longint):longint;
begin
query_min:=maxlongint;
repeat
while r-(r and (-r))>=l do
begin
query_min:=_min(query_min,min[r]);
dec(r,r and (-r));
end;
if r<l then break;
query_min:=_min(query_min,a[r]);
dec(r);
until r<l;
end;
begin
readln(n,q1,m,q2);
for i:=1 to n do
begin
read(t);
insert(i,t);
end;
prep_rmq;
for i:=1 to q1 do
begin
readln(l,r);
writeln(query_min(l,r));
end;
for i:=1 to m do
begin
read(q1,t);
insert(q1,t);
end;
for i:=1 to q2 do
begin
readln(t);
writeln(query_sum(t));
end;
end.

看不懂动手单步一下,原理是很清晰的。
另外,站长团上有产品团购,便宜有保证

热心网友 时间:2022-05-04 22:35

树状数组的 点更新操作 通过修改后可以变为查询点 因为它是一层层向外扩展的

而查询区间可以修改后变为修改区间 你想想 就明白了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 树状数组解决最长不下降子序列 讲讲主要思路就好 求一算法 ,是关于数组的问题 代表树状数组的数组是什么意思 说的通俗易懂一点 tree 树状数组的基本概念 nba篮筐高度是多高? 标准的篮球高度多少? 篮球标准篮筐高度是多少? 篮球的标准尺寸是多少? CBA/NBA/国际篮联的篮球圈的标准高度分别是多少? 加盟做麻花有什么样的市场? 什么叫特稿 申赋渔的人物经历 红沙糖可作肥料用吗? 新闻写作中特稿与特写的区别 有什么红糖制零食 请问:报刊杂志专稿、特稿的投稿信箱? 无极麻花培训,我想学做无极麻花 新闻新兴文体包括哪些? 老手艺做麻团的片段 新闻特稿写作的具体要求是什么?有哪些限制性因素?求解答,谢谢 树状数组的树状数组的充分性 神犇求解…树状数组能求区间最值吗?时间复杂度是多少啊?…还有就是树状... 如何利用树状数组修改一个区间? 线段树的解决实际问题 高级数据结构的目录 c 语言知识清单? C语言,哪位好心的大哥,姐姐:能告述我位运算吗?我看不懂啊! NOI比noip多考些什么 惠普e72530如何设置扫描 word2007中水印背景图片如何修改? 在word文档中,通过水印添加背景,背景图片会变淡, 请问有什么方法可以解决这个问题? 让水印清晰。。。 如何设置word背景图片的透明度和大小 photoshop怎样制作一张水印图案的背景图。例如以下这张图片背的景样 在中公学完Java之后,一般能拿多少薪资呢? 配眼镜视频:带女儿去医院配眼镜,这个画面你是不是很熟悉 在培训学校学完Java工资能拿多少? 最近在抖音上看到很多关于领军眼镜的视频,他们配眼镜专业不? 参加JAVA培训之后工资大概多少 那里有眼镜配置标准视频,我想了解一下配置一付近视眼镜的过程 女孩学习Java好就业吗?收入能达到多少?