您的位置:首页 > 其它

hdu_1166 敌兵布阵(线段树)

2013-12-13 15:22 309 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1166

分析: 虽然题目的意思很清楚,但是不会写线段树…… (太弱了),所以参考了大神的代码,觉得递归使得整个程序显得非常漂亮。

           ( 线段树的总结等刷够了题在写吧~,觉得现在的自己实在是太弱了! 今年的长春真的很冷……)

            感觉题目卡得很死,如果用string的话直接tle,但是换了字符串之后就AC了,还有一点就是应该正确使用位移运算!

           

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int a[50002];
struct node
{
int l,r,v,sum;
}T[150010];

void create(int u,int l,int r)
{
T[u].l=l; T[u].r=r;
if(l==r){
T[u].v=T[u].sum=a[r];
return;
}
T[u].v=0;
int mid=(l+r)>>1;
create(u<<1,l,mid);
create(((u<<1)|1),mid+1,r);
T[u].sum=T[u<<1].sum+T[((u<<1)|1)].sum;
}

void update(int order,int v,int u)
{
if(order==T[u].l&&order==T[u].r){
T[u].sum+=v;
T[u].v+=v;
return;
}
else{
if(order<=T[u<<1].r) update(order,v,u<<1);
else update(order,v,(u<<1)|1);
T[u].sum=T[u<<1].sum+T[(u<<1)|1].sum;
}
}

int query(int from,int to,int u)
{
if(from==T[u].l&&to==T[u].r) return T[u].sum;
if(to<=T[u<<1].r) return query(from,to,u<<1);
else if(from>=T[(u<<1)|1].l) return query(from,to,(u<<1)|1);
else return query(from,T[u<<1].r,u<<1)+query(T[(u<<1)|1].l,to,(u<<1)|1);
}

int main()
{
//freopen("in.txt","r",stdin);
int t,n;
char s[6];
scanf("%d",&t);
for(int ccnt=1;ccnt<=t;ccnt++){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
create(1,1,n);//u l r
printf("Case %d:\n",ccnt);

while(1){
scanf("%s",s);
if(s[0]=='E') break;

if(s[0]=='Q'){
int from,to;
scanf("%d%d",&from,&to);
int ans=query(from,to,1);
printf("%d\n",ans);
}
else{
int order,num;
scanf("%d%d",&order,&num);
if(s[0]=='A') num=num;
else num=-num;
update(order,num,1);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线段树