分块 HDU 1166

用分块也可以写 

就分成根号n块

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<set>
#include<string>
#include<map>

using namespace std;
typedef long long LL;

#define inf  2000000000
#define MAXN 200010

int num[MAXN];
int en[MAXN];

int main()
{

    int t,ca;
    scanf("%d",&t);
    ca=1;

    while(t--)
    {
        int n;
        scanf("%d",&n);
        int sz=(int)sqrt(1.0*n);
        memset(en,0,sizeof(en));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&num[i]);
            int x=i/sz;
            en[x]+=num[i];
        }
        printf("Case %d:\n",ca++);
        while(1)
        {
            char s[10];
            scanf("%s",s);
            if(s[0]=='E')
                break;
            int a,b;
            scanf("%d%d",&a,&b);
            if(s[0]=='Q')
            {
                int ans=0;

                for(int i=a;i<=b;)
                {
                    int x=i/sz;
                    if(i%sz==0&&i+sz-1<=b)
                    {
                        ans+=en[x];
                        i+=sz;
                    }
                    else
                    {
                        ans+=num[i];
                        i++;
                    }
                }
                printf("%d\n",ans);
            }
            else if(s[0]=='A')
            {
                num[a]+=b;
                int x=a/sz;
                en[x]+=b;
            }
            else
            {
                b=-b;
                num[a]+=b;
                int x=a/sz;
                en[x]+=b;
            }
        }
    }
    return 0;
}

 

posted on 2017-02-24 13:22  HelloWorld!--By-MJY  阅读(114)  评论(0编辑  收藏  举报

导航