洛谷 P3374【模板】树状数组 1

题目大意:
给出有N个数的序列a[1],a[2]……,a[n-1],a[n],以及M个操作,每次操作【K,X,Y】:
K=1,第x个数+y
K=2,求区间[X,Y]的总和。

时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=10000,M<=10000
对于100%的数据:N<=500000,M<=500000

题解:
树状数组:
lowbit(i)=i and (-i)

1.给第i个数的c[i]加上a[i],c[j]也要加上a[i],c[k]也要加上a[i],一直到总数大于N。
(j=i+lowbit(i) ; k=j+lowbit(j))

2.查询的时候,要计算总和,就要计算sum[y]-sum[x-1],这时候ans=∑c[j-lowbit(j)]
—— i>=j>=1 ——

var
     f:array [0..1000001] of longint;
     i,k,x,y,n,m:longint;

procedure insert(p,q:longint);
begin
     while p<=n do
     begin
           f[p]:=f[p]+q;
           p:=p+(p and (-p));
     end;
end;

function count(c:longint):longint;
begin
     count:=0;
     while c>0 do
     begin
          count:=count+f[c];
          c:=c-(c and (-c));
     end;
     exit(count);
end;

begin
     readln(n,m);
     for i:=1 to n do
     begin
          read(x);
          insert(i,x);
     end;
     for i:=1 to m do
         begin
              readln(k,x,y);
              if k=1 then insert(x,y)
                     else writeln(count(y)-count(x-1));
         end;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值