结点更新+区间统计——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;
}
原文地址:https://www.cnblogs.com/huhuuu/p/2104475.html