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

hdu 1166 敌兵布阵

2018年12月30日 ⁄ 综合 ⁄ 共 1079字 ⁄ 字号 评论关闭

线段树简单题

 

#include<stdio.h>
#define N 50005
int a[N],n,c,cnt;
struct op
{
    int left,right,cont;
}p[N*3];
void insert(int l,int r,int i)
{
    p[i].left=l;p[i].right=r;
    if(l==r)
    {
        p[i].cont=a[l];return;
    }
    int mind=(l+r)/2;
    insert(l,mind,i*2);
    insert(mind+1,r,i*2+1);
        p[i].cont=p[i*2].cont+p[i*2+1].cont;
}
void xiugai(int l,int r,int i)
{
    if(l==r)
    {
        p[i].cont+=cnt;
        return ;
    }
    int mind=(l+r)/2;
    if(c>mind)
    {
        xiugai(mind+1,r,i*2+1);
    }
    else 
    {
        xiugai(l,mind,i*2);
    }
    p[i].cont=p[i*2].cont+p[i*2+1].cont;
}
int chaxun(int start,int end,int i)
{
    int sum=0;
    if(p[i].left==start&&p[i].right==end)
    {
        return p[i].cont;
    }
    int mind=(p[i].left+p[i].right)/2;
    if(start>mind)
        sum+=chaxun(start,end,i*2+1);
    else if(end<=mind)
         sum+=chaxun(start,end,i*2);
    else
    {
        sum+=chaxun(start,mind,i*2);
        sum+=chaxun(mind+1,end,i*2+1);
    }
    return sum;
}
int main()
{
    int i,j,t,o=1;
    char str[20];
    scanf("%d",&t);
        while(o<=t)
        {
            scanf("%d",&n);
            for(i=1;i<=n;i++)
                scanf("%d",&a[i]);
            insert(1,n,1);
            printf("Case %d:\n",o);
            while(scanf("%s",str),str[0]!='E')
            {
                scanf("%d%d",&c,&cnt);
                if(str[0]=='A')
                {
                    xiugai(1,n,1);
                }
                else if(str[0]=='S')
                {
                    cnt=-cnt;
                    xiugai(1,n,1);
                }
                else if(str[0]=='Q')
                {
                        printf("%d\n",chaxun(c,cnt,1));
                }
            }
            o++;
        }
        return 0;
}

 

【上篇】
【下篇】

抱歉!评论已关闭.