结点更新+区间统计——hdu1166

在单纯的更新结点时,是不需要用到遗传结构的

在区间的更新时,会用到遗传结构

结点更新+区间统计——hdu1166 View Code
#include < stdio.h >
#include
< string .h >

struct data
{
int l,r,val;
}st[
200009 ];

void build( int ll, int rr, int n)
{
st[n].l
= ll;
st[n].r
= rr;
st[n].val
= 0 ;
if (ll == rr) return ;
int mid = (ll + rr) / 2 ;
build(ll,mid,
2 * n);
build(mid
+ 1 ,rr, 2 * n + 1 );
}
void updata( int ll, int rr, int a, int n, char c) //
{
if (st[n].l == ll && st[n].r == rr)
{
if (c == ' + ' )
st[n].val
+= a;
else
st[n].val
-= a;
return ;
}

if (c == ' + ' )
st[n].val
+= a;
else
st[n].val
-= a;

int mid = (st[n].l + st[n].r) / 2 ;
if (rr <= mid)
{
updata(ll,rr,a,
2 * n,c);
}
else if (ll >= mid + 1 ) updata(ll,rr,a, 2 * n + 1 ,c);
else
{
updata(ll,mid,a,
2 * n,c);
updata(mid
+ 1 ,rr,a, 2 * n + 1 ,c);
}

}

int search( int ll, int rr, int n)
{
if (st[n].l == ll && st[n].r == rr) return st[n].val;

int mid = (st[n].l + st[n].r) / 2 ;
if (rr <= mid) return search(ll,rr, 2 * n);
else if (ll >= mid + 1 ) return search(ll,rr, 2 * n + 1 );
else
{
return search(ll,mid, 2 * n) + search(mid + 1 ,rr, 2 * n + 1 );
}
}

int main()
{
int t;
scanf(
" %d " , & t);
int cc = 1 ;
while (t -- )
{

printf(
" Case %d:\n " ,cc);
cc
++ ;
int n;
scanf(
" %d " , & n);
int i;
build(
1 ,n, 1 );
for (i = 1 ;i <= n;i ++ )
{
int temp;
scanf(
" %d " , & temp);
updata(i,i,temp,
1 , ' + ' );
}
getchar();
char ss[ 10 ];
while ( 1 )
{
scanf(
" %s " ,ss);
getchar();
if (strcmp(ss, " Query " ) == 0 )
{
int ll,rr;
scanf(
" %d%d " , & ll, & rr);
printf(
" %d\n " ,search(ll,rr, 1 ));
}
else if (strcmp(ss, " Add " ) == 0 )
{
int no,addv;
scanf(
" %d%d " , & no, & addv);
updata(no,no,addv,
1 , ' + ' );
}
else if (strcmp(ss, " Sub " ) == 0 )
{
int no,addv;
scanf(
" %d%d " , & no, & addv);
updata(no,no,addv,
1 , ' - ' );
}
else
{
break ;
}
}
}
return 0 ;
}

你可能感兴趣的:(HDU)