UvaLive

发布时间:2024-11-17 03:56

UvaLive-2191-Potentiometers

最新推荐文章于 2018-06-14 20:26:00 发布

南宮逸辰 于 2013-04-21 19:57:02 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

这个题属于一个典型的区间维护题吧,有2个操作,

1、S x y 把第x个数改成y,

2、M x y 求出[x,y]区间所有数的和,

个人用树状数组做的,因为树状数组好写点,还是 比较简单~

代码:

#include<cstdio>

#include<cstring>

#include<iostream>

using namespace std;

const int maxn=400001;

int n,t[maxn];

int lowbit(int x)

{

return x&(-x);

}

long long sum(int x)

{

long long sum=0;

while(x>0)

{

sum+=t[x];

x-=lowbit(x);

}

return sum;

}

void Update(int x,int val)

{

while(x<=maxn)

{

t[x]+=val;

x+=lowbit(x);

}

}

int main()

{

int cas=1;

while(scanf("%d",&n)&&n)

{

memset(t,0,sizeof(t));

for(int i=1;i<=n;i++)

{

int ita;

scanf("%d",&ita);

Update(i,ita);

}

if(cas>1)

printf("\n");

printf("Case %d:\n",cas++);

while(1)

{

char op[10];

scanf("%s",op);

if(!strcmp(op,"END"))

break;

if(op[0]=='S')

{

int ita,itb;

scanf("%d%d",&ita,&itb);

long long val=sum(ita)-sum(ita-1);

Update(ita,itb-val);

}

else

{

int ita,itb;

scanf("%d%d",&ita,&itb);

printf("%lld\n",sum(itb)-sum(ita-1));

}

}

}

return 0;

}

网址:UvaLive https://www.yuejiaxmz.com/news/view/96931

随便看看