您的位置:首页 > 其它

HDU1166 敌兵布阵 非递归线段树 & 递归线段树 & 树状数组

2014-07-05 19:33 274 查看
参考文献:点击打开链接

非递归版线段树:

int c[200010],M;

void add(int k, int v)
{
for (c[k+=M]+=v, k>>=1 ; k; k>>=1)
if (k<M)
c[k]=c[k << 1] + c[k << 1 | 1];
return ;
}

int query(int s, int t)
{
int Ans=0;
for (s=s+M-1,t=t+M+1; s^t^1; s>>=1,t>>=1)
{
if (!(s & 1)) Ans+=c[s^1];
if (t & 1)    Ans+=c[t^1];
}
return Ans;
}

int main()
{
//freopen("input.txt","r",stdin);
int T;
scanf("%d",&T);
for (int k=1; k<=T; k++)
{
int n;
scanf("%d",&n);
M=1 << (int)(log((double)n)/log(2.0)+1);
for (int i=0; i!=n; i++)
scanf("%d",&c[i+M]);
for (int i=M-1; i>=1; i--)
c[i]=c[i << 1]+c[i << 1 | 1];

char q[10];
int x,y;
printf("Case %d:\n",k);
while (scanf("%s",q) && strcmp(q,"End"))
{
scanf("%d%d",&x,&y);
if (q[0]=='A')
add(x-1,y);
else
if (q[0]=='S')
add(x-1,-y);
else
printf("%d\n",query(x-1,y-1));
}
}
}


递归版线段树:

#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1

const int maxn = 55555;
int sum[maxn<<2];

void PushUP(int rt) {
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}

void build(int l,int r,int rt) {
if (l == r) {
scanf("%d",&sum[rt]);
return ;
}
int m = (l + r) >> 1;
build(lson);
build(rson);
PushUP(rt);
}

void update(int p,int add,int l,int r,int rt) {
if (l == r) {
sum[rt] += add;
return ;
}
int m = (l + r) >> 1;
if (p <= m) update(p , add , lson);
else update(p , add , rson);
PushUP(rt);
}

int query(int L,int R,int l,int r,int rt) {
if (L <= l && r <= R) {
return sum[rt];
}
int m = (l + r) >> 1;
int ret = 0;
if (L <= m) ret += query(L , R , lson);
if (R > m) ret += query(L , R , rson);
return ret;
}

int main()
{
//freopen("input.txt","r",stdin);
int T , n;
scanf("%d",&T);
for (int cas = 1 ; cas <= T ; cas ++) {
printf("Case %d:\n",cas);
scanf("%d",&n);
build(1 , n , 1);
char op[10];
while (scanf("%s",op)) {
if (op[0] == 'E') break;
int a , b;
scanf("%d%d",&a,&b);
if (op[0] == 'Q') printf("%d\n",query(a , b , 1 , n , 1));
else if (op[0] == 'S') update(a , -b , 1 , n , 1);
else update(a , b , 1 , n , 1);
}
}
return 0;
}

树状数组版:

int a[50005],c[50005],n;

int lowbit(int x) { return x & -x ; }

int sum(int k)
{
int ret=0;
while (k)
{
ret+=c[k];
k-=lowbit(k);
}
return ret;
}

void add(int k, int x)
{
while (k<=n)
{
c[k]+=x;
k+=lowbit(k);
}
}

int main()
{
//freopen("input.txt","r",stdin);
int T;
scanf("%d",&T);
for (int k=1; k<=T; k++)
{
scanf("%d",&n);
for (int i=1; i<=n; i++)
scanf("%d",&a[i]);
memset(c,0,sizeof(c));
for (int i=1; i<=n; i++)
add(i,a[i]);
char q[10];
int x,y;
printf("Case %d:\n",k);
while (scanf("%s",q) && strcmp(q,"End"))
{
scanf("%d%d",&x,&y);
if (q[0]=='A')
add(x,y);
else
if (q[0]=='S')
add(x,-y);
else
printf("%d\n",sum(y)-sum(x-1));
}
}
return 0;
}


好吧,已跪。最后膜拜一下看不见背影的大牛们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: