hdu 2642 stars

来源:互联网 发布:linux组织文件目录结构 编辑:程序博客网 时间:2024/04/25 15:04

二维的树状数组模板

int lowbit(int x){    return x & (-x);}void modify(int x,int y,int data){    for(int i=x;i<MAXN;i+=lowbit(i))        for(int j=y;j<MAXN;j+=lowbit(j))            a[i][j]+=data;}int get_sum(int x,int y){    int res=0;    for(int i=x;i>0;i-=lowbit(i))        for(int j=y;j>0;j-=lowbit(j))            res+=a[i][j];    return res;}
直接套模板就行了。

因为本身的区间坐标涉及0  所以要输入的坐标+1 向后推一下。

二维求和涉及一个基本的容斥。

#include<bits/stdc++.h>#define N 1011#define LL long longusing namespace std;int n,a[N][N];bool flag[N][N];int lowbit(int x){    return x&(-x);}int sw(int x,int y,int temp){    for(int i=x;i<N;i+=lowbit(i))        for(int j=y;j<N;j+=lowbit(j))           a[i][j]+=temp;}int sum(int x,int y){    int s=0;    for(int i=x;i>0;i-=lowbit(i))        for(int j=y;j>0;j-=lowbit(j))            s+=a[i][j];    return s;}int main(){    int T,n,m,x1,x2,y1,y2,ans;    char ch;    scanf("%d",&T);    memset(flag,false,sizeof(flag));    memset(a,0,sizeof(a));    while(T--)    {        getchar();        scanf("%c",&ch);        if(ch=='B')        {            scanf("%d%d",&n,&m);            n+=1;m+=1;            if(flag[n][m]) continue;            sw(n,m,1);            flag[n][m]=true;        }        else if(ch=='D')        {            scanf("%d%d",&n,&m);            n+=1;m+=1;            if(!flag[n][m]) continue;            sw(n,m,-1);            flag[n][m]=false;        }        else        {            scanf("%d%d%d%d",&x1,&x2,&y1,&y2);            x1+=1,x2+=1,y1+=1,y2+=1;            if(x1>x2) swap(x1,x2);            if(y1>y2) swap(y1,y2);            ans=sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1);            printf("%d\n",ans);        }    }    return 0;}


0 0
原创粉丝点击