POJ1990 MooFest——树状数组

维护两个树状数组,一个记录这个坐标所控制的范围内的奶牛个数,另外一个记录这个坐标所控制范围内的奶牛坐标之和。

CODE

Program POJ1990;//By_Poetshy
Const 
	maxn=20000;
Var
	i,n							:Longint;
	p,m,ans						:Int64;
	v,x,a,h						:Array[1..maxn]of Int64;
	
Procedure Qsort(l,r:Longint);
var i,j,k,temp:Longint;
begin
	i:=l;j:=r;k:=v[(i+j)>>1];
	repeat
		while v[i]<k do inc(i);
		while v[j]>k do dec(j);
		if i<=j then 
			begin
				temp:=x[i];x[i]:=x[j];x[j]:=temp;
				temp:=v[i];v[i]:=v[j];v[j]:=temp;
				inc(i);dec(j);
			end;
	until i>j;
	if i<r then Qsort(i,r);
	if l<j then Qsort(l,j);
end;
	
Function Count(i:Longint):Int64;
begin
	Count:=0;
	while i>0 do 
		begin
			inc(Count,a[i]);
			dec(i,(i)and(-i));
		end;
end;
	
Function Counth(i:Longint):Int64;
begin
	Counth:=0;
	while i>0 do 
		begin
			inc(Counth,h[i]);
			dec(i,(i)and(-i));
		end;
end;
	
Procedure Deal(i:Longint);
var j:Longint;
begin
	j:=x[i];
	while j<=maxn do 
		begin
			inc(a[j]);
			inc(h[j],x[i]);
			inc(j,j and(-j));
		end;
end;
	
BEGIN
	readln(n);
	for i:=1 to n do readln(v[i],x[i]);
	Qsort(1,n);
	for i:=1 to n do 
		begin	
			p:=Count(x[i]);
			m:=Counth(x[i]);
			inc(ans,v[i]*(p*x[i]-m));
			p:=Count(maxn)-p;
			m:=counth(maxn)-m;
			inc(ans,v[i]*(m-p*x[i]));
			Deal(i);
		end;
	writeln(ans);
END.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值