现在的位置: 首页 > 综合 > 正文

敌兵布阵 线段树 链表

2013年04月11日 ⁄ 综合 ⁄ 共 1339字 ⁄ 字号 评论关闭
#include<stdio.h>
#include
<string.h>
int c[60000];
struct node
{
struct node *rchild,*lchild;
int right,left,val;
};
int creat_tree( int l,int r,struct node *q)
{
int mid;
struct node *q1,*q2;
q1
=new node,q2=new node;
q
->lchild=q1,q->rchild=q2;
q
->left=l;
q
->right=r;
if(q->right==q->left)
return q->val=c[l];
mid
=(q->left+q->right)/2;
return q->val=creat_tree(l,mid,q1)+creat_tree(mid+1,r,q2);
}

void print(struct node *l )
{
if(l)
{
//printf("hello world\n");
printf("%d %d %d\n",l->left,l->right,l->val);
print(l
->lchild);
print(l
->rchild);

}
}
void update(int j,int v,struct node *q)
{
int mid;
// struct node *q1,*q2;
// q1=new node,q2=new node;
// q->lchild=q1;
// q->rchild=q2;
q->val+=v;
if(q->left==q->right)
return ;
mid
=(q->left+q->right)/2;
if(mid>=j)
update(j,v,q
->lchild);
else
update(j,v,q
->rchild);
}
int query(int l,int r,struct node *q)
{

int mid;
if(q->left==l&&q->right==r)
return q->val;
mid
=(q->left+q->right)/2;
if(mid>=r)
query(l,r,q
->lchild);
else if(mid<l)
query(l,r,q
->rchild);
else
{
return query(l,mid,q->lchild)+query(mid+1,r,q->rchild);

}
}
int main( )
{
int T,N,a,b,d,e,i,k=0;
struct node *p;
p
=new node;
scanf(
"%d",&T);
while(T--)
{
scanf(
"%d",&N);
for( i=1 ;i<=N;i++)
scanf(
"%d",&c[i]);
creat_tree(
1,N,p);
//print(p);
printf("Case %d:\n",++k);
char ch[20];
while(1)
{

scanf(
"%s",ch);
if(ch[0]=='E')
break;
scanf(
"%d%d",&d,&e);
if(ch[0]=='A')
update(d,e,p);
else if(ch[0]=='S')
update(d,
-e,p);
else if(ch[0]=='Q')
{

printf(
"%d\n",query(d,e,p));
}
}
}
return 0;
}

抱歉!评论已关闭.