hdu 1890 二维树状数组

来源:互联网 发布:kmp算法c代码 编辑:程序博客网 时间:2024/05/21 10:12
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int sum[1010][1010];int mark[1010][1010];int add(int a,int b,int c){    int i,j;    for(i=a;i<=1001;i+=(i&-i))    for(j=b;j<=1001;j+=(j&-j))    sum[i][j]+=c;    return 0;    }int find(int a,int b){    int i,j,s=0;    for(i=a;i>0;i-=(i&-i))    for(j=b;j>0;j-=(j&-j))    s+=sum[i][j];    return s;}int max(int a,int b){    return a>b?a:b;}int min(int a,int b){    return a<b?a:b;}int main(){    int i,j,T,Q;    int a1,a2,b1,b2,n,d=1;    char str[5];    scanf("%d",&T);    while(T--)    {        scanf("%d",&Q);        printf("Case %d:\n",d++);        memset(sum,0,sizeof(sum));        for(i=1;i<=1001;i++)        for(j=1;j<=1001;j++)        {            mark[i][j]=1;            add(i,j,1);        }        while(Q--)        {            scanf("%s",str);            if(str[0]=='S')            {                scanf("%d%d%d%d",&a1,&b1,&a2,&b2);                a1++;a2++;b1++;b2++;                int k1=max(a1,a2);                int k2=min(a1,a2);                int t1=max(b1,b2);                int t2=min(b1,b2);                int s1=find(k1,t1);                int s2=find(k1,t2-1);                int s3=find(k2-1,t1);                int s4=find(k2-1,t2-1);                printf("%d\n",s1-s2-s3+s4);            }            else if(str[0]=='A')            {                scanf("%d%d%d",&a1,&b1,&n);                a1++;b1++;                add(a1,b1,n);                mark[a1][b1]+=n;            }            else if(str[0]=='D')            {                scanf("%d%d%d",&a1,&b1,&n);                a1++;b1++;                int step=mark[a1][b1]>n?n:mark[a1][b1];                add(a1,b1,-step);                mark[a1][b1]-=step;            }            else             {                scanf("%d%d%d%d%d",&a1,&b1,&a2,&b2,&n);                a1++;a2++;b1++;b2++;                int step=mark[a1][b1]>n?n:mark[a1][b1];                add(a1,b1,-step);                add(a2,b2,step);                mark[a1][b1]-=step;                mark[a2][b2]+=step;            }        }    }    return 0;}
0 0
原创粉丝点击