最近搞算法,唉,一个人慢慢的弄,有时候看了一天都不知道怎么回事
没有人带领就是没办法 啊
悲剧········
1166 弄了半天
终于弄出来了
有一个在scanf("%s",str);前面加了一个getchar()
能够正常现实,但是就是wrong
最后查出来了
坑爹··········
杭电 1166
是线段树算法
#include "stdio.h"
struct node
{
int l,r,sum;
}no[3*50005];
int ks[50005];
int t1,t2;
void build_tree(int a,int b,int c)
{
no[c].l = a ;
no[c].r = b ;
if (a == b)
{
no[c].sum = ks[a];
return ;
}
int mid =(a + b) >> 1 ;
build_tree(a , mid , 2*c);
build_tree(mid+1 , b , 2*c+1);
no[c].sum = no[2*c].sum + no[2*c+1].sum;
}
void add_sub(int a,int b,int c)
{
if (a == b )
{
no[c].sum += t2;
return ;
}
int mid = (a + b ) >> 1;
if (t1 <= mid )
{
add_sub(a , mid , 2*c );
}
else
add_sub(mid +1 , b , 2*c+1 );
no[c].sum = no[2*c].sum + no[2*c+1].sum ;
}
int find_tree(int a, int b,int c)
{
if ((no[c].l == a )&& (no[c].r == b ))
{
return no[c].sum;
}
int mid = (no[c].l + no[c].r) >> 1 ;
if (b <= mid)
{
find_tree(a , b , 2*c);
}
else
if (a > mid)
{
find_tree(a , b , 2*c+1);
}
else
return (find_tree(a, mid , 2*c) + find_tree(mid+1 , b , 2*c+1) );
}
int main(int argc, char* argv[])
{
int n,index,cases = 0 ;
char str[10];
scanf("%d",&index);
while (index--)
{
cases++;
scanf("%d",&n);
for (int i =1 ; i <= n ; ++i )
{
scanf("%d",&ks[i]);
}
build_tree(1 , n , 1 );
printf("Case %d:\n",cases);
while (scanf("%s",str))
{
if (str[0] == 'A')
{
scanf("%d%d",&t1,&t2);
add_sub(1, n , 1 );
}
else
if (str[0] == 'S')
{
scanf("%d%d",&t1,&t2);
t2 = 0 - t2 ;
add_sub(1, n, 1);
}
else
if (str[0] == 'Q')
{
scanf("%d%d",&t1,&t2);
printf("%d\n",find_tree(t1 , t2 ,1));
}
else
break;
}
}
return 0;
}