敌兵布阵 HDU - 1166

http://acm.hdu.edu.cn/showproblem.php?pid=1166

cdq入门https://www.cnblogs.com/mlystdcall/p/6219421.html

#include <bits/stdc++.h>
using namespace std;

struct node
{
    int tp;
    int pos;
    int val;
};

node order[150010],tmp[150010];
int ans[50010];
int n,q,num,len;

void cdq(int l,int r)
{
    int cnt,i,m,p,q,sum;
    if(l==r) return;
    cnt=1,m=(l+r)/2,p=l,q=m+1,sum=0;
    cdq(l,m);
    cdq(m+1,r);
    while(p<=m&&q<=r)
    {
        if(order[p].pos<order[q].pos||(order[p].pos==order[q].pos&&order[p].tp<order[q].tp))
        {
            if(order[p].tp==1) sum+=order[p].val;
            tmp[cnt++]=order[p++];
        }
        else
        {
            if(order[q].tp==2) ans[order[q].val]-=sum;
            else if(order[q].tp==3) ans[order[q].val]+=sum;
            tmp[cnt++]=order[q++];
        }
    }
    while(p<=m)
    {
        tmp[cnt++]=order[p++];
    }
    while(q<=r)
    {
        if(order[q].tp==2) ans[order[q].val]-=sum;
        else if(order[q].tp==3) ans[order[q].val]+=sum;
        tmp[cnt++]=order[q++];
    }
    for(i=l;i<=r;i++)
    {
        order[i]=tmp[i-l+1];
    }
}

int main()
{
    int t,cas,i,l,r,val;
    char op[10];
    scanf("%d",&t);
    for(cas=1;cas<=t;cas++)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&val);
            order[i].tp=1,order[i].pos=i,order[i].val=val;
        }
        num=n+1,len=1;
        while(1)
        {
            scanf("%s",op);
            if(op[0]=='A')
            {
                scanf("%d%d",&l,&r);
                order[num].tp=1,order[num].pos=l,order[num].val=r;
                num++;
            }
            else if(op[0]=='S')
            {
                scanf("%d%d",&l,&r);
                order[num].tp=1,order[num].pos=l,order[num].val=-r;
                num++;
            }
            else if(op[0]=='Q')
            {
                scanf("%d%d",&l,&r);
                order[num].tp=2,order[num].pos=l-1,order[num].val=len;
                num++;
                order[num].tp=3,order[num].pos=r,order[num].val=len;
                num++,len++;
            }
            else break;
        }
        memset(ans,0,sizeof(ans));
        num--,len--;
        cdq(1,num);
        printf("Case %d:\n",cas);
        for(i=1;i<=len;i++)
        {
            printf("%d\n",ans[i]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/81195904