TYVJ1324(夏夜砍树)

算法:树状数组。

program P1324;

const
	maxn=200000;

var
	a,tree:array [0..maxn] of longint;
	n,m,temp:longint;
	
procedure add(x,y:longint);	
begin
	while x<=n do
		begin
			inc(tree[x],y);
			x:=x+(x and (-x));
		end;
end;
	
procedure init;
var
	i:longint;
begin
	readln(n);
	for i:=1 to n do 
		begin
			read(a[i]);
			add(i,a[i]);//从i开始为之后的树状数组元素加入a[i]。
		end;
	readln;
end;

function down(x:longint):longint;
begin
	down:=0;
	while x>0 do 
		begin
			inc(down,tree[x]);
			x:=x-(x and (-x));
		end;
end;
	
procedure main;
var
	i,x,y:longint;
	ans:real;
begin
	readln(m);
	for i:=1 to m do 
		begin
			readln(x,y);
			temp:=(x+y) >> 1;
			ans:=down(y)-down(x-1);//计算从x到y的区间和,为1~y的区间和-1~x-1的区间和。
			writeln(ans*3.14:0:2);
			if a[temp]<>0 then//如果当前位置不为0,那么就会影响temp及temp之后的区间和,因此还要进行修改。
				begin
					add(temp,-a[temp]);//temp之前的数已影响不到,所以应该修改temp之后的数组,让其减去a[temp]。
					a[temp]:=0;//同时a[temp]置0,这样在下次再找到这个位置是无需再次进行修改。
				end;
		end;
end;	

begin
	assign(input,'P1324.in'); reset(input);
	assign(output,'P1324.out'); rewrite(output);
	
	init;
	main;
	
	close(input); close(output);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值