二维树状数组
二维树状数组入门:
很详细
题目:HDOJ 1892
注意点的坐标可以为0所以要细心处理一下 ,
然后照着这个题解写,就没问题了:http://blog.csdn.net/x_white/article/details/7982035
再来一道:
PKU 2155: 大致是修改区间求点值的改版也是二维树状数组,还有验证了前面博客上说的: 向上或者向下求区间都没问题
pku1990:这个题目大赞,推导神题就是做出来有不一样的赶脚。可见树状数组真是一个神奇的工具
写给自己看的核心代码: dis[i]+=dis[i-1]+a[i].x;//统计x坐标的和
ll t=0;// t代表求这个位子与其他点的距离
int x=a[i].x;
t+=sum(x,s)*a[i].x-sum(x,ss);//sum(x,s) 统计 x坐标小于a[i].x的个数, sum(x,ss)统计x 坐标小于 a[i].x的坐标和
t+=dis[i]-sum(x,ss)-a[i].x*(i-1-sum(x,s))-a[i].x; //X坐标大于a[i].x之和,细心推导一下应该可以出来
ans+=t*a[i].v;
update(a[i].x,s,1);
int x=a[i].x;
t+=sum(x,s)*a[i].x-sum(x,ss);//sum(x,s) 统计 x坐标小于a[i].x的个数, sum(x,ss)统计x 坐标小于 a[i].x的坐标和
t+=dis[i]-sum(x,ss)-a[i].x*(i-1-sum(x,s))-a[i].x; //X坐标大于a[i].x之和,细心推导一下应该可以出来
ans+=t*a[i].v;
update(a[i].x,s,1);
update(a[i].x,ss,a[i].x);
随性Code