您的位置:首页 > 其它

NYOJ 123士兵杀敌(四)(树状数组)(插线问点)

2013-07-18 20:54 411 查看
和树状数组插点求线刚好相反,插线求点看上去似乎是插点求线的逆操作,插点求线操作是:插点时更新后方+lowbit位置,求线时统计前方-lowbit 的和,插线求点反而是插线时修改前方lowbit位置值,求点时统计后方lowbit的和,插点求线代码见士兵杀敌(二),以下是插线求点的方法:

#include<cstdio>
#include<cstring>
const int M=1000010;
int data[M];
int Max;
inline int LowBit(int n)
{
return n&(-n);
}
void Plus(int n,int value) //前n项每项增加value
{
while(n>0)
{
data
+=value;
n-=LowBit(n);
}
}
int Get(int n) //获取每个位置的值
{
int sum=0;
while(n<=Max)
{
sum+=data
;
n+=LowBit(n);
}
return sum;
}
int main()
{
int n,a,b,v;
char s[9];
scanf("%d%d",&n,&Max);
while(n--)
{
scanf("%s",s);
if(s[0]=='A')
{
scanf("%d%d%d",&a,&b,&v);
Plus(a-1,-v);//关键
Plus(b,v);//关键
}
else
{
scanf("%d",&a);
printf("%d\n",Get(a));
}
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: