HDU - 4456 Crowd

来源:互联网 发布:打鱼软件开发 编辑:程序博客网 时间:2024/06/07 11:54

题目见:
[http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34034]

一道显然的二维树状数组,还是单点修改,矩阵查询。
重点是把曼哈顿距离包含的一个立着的正方形旋转45度,变成水平的。
虽然同时mat由水平变成了立着的,但计算时并不会受影响,因为超出的地方不会被修改。
有两个地方要注意:
(1).坐标的转换
(2).下标离散化

代码:

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define MAXM  80000#define MAXN 5000000int n,m,p[MAXN+10],x[MAXN+10],y[MAXN+10],z[MAXN+10];int h[MAXN+10],cnt,c[MAXN+10],w;int lowbit(int x){    return x&(-x);}void Get_ready(int xx,int yy){    for(int i=xx; i<=w; i+=lowbit(i))        for(int j=yy; j<=w; j+=lowbit(j))            h[cnt++]=i*w+j;}void GetPoint(int xx,int yy,int &newx,int &newy){    newx=xx-yy+n; //不要负数和0    newy=xx+yy;}void update(int xx,int yy,int d){    for(int i=xx; i<=w; i+=lowbit(i))        for(int j=yy; j<=w; j+=lowbit(j)){            int pos=lower_bound(h ,h+cnt ,i*w+j)-h;            c[pos]+=d;        }}int Getsum(int xx,int yy){    int ret=0;    for(int i=xx; i>0; i-=lowbit(i))        for(int j=yy; j>0; j-=lowbit(j)){            int pos=lower_bound(h ,h+cnt ,i*w+j) - h;            if(h[pos] == i*w+j)   //没有对应的hash值说明这个位置上的c值为0,忽略                ret+=c[pos];        }    return ret;}int sum(int x1,int y1,int x2,int y2){    return Getsum(x2,y2)-Getsum(x1-1,y2)-Getsum(x2,y1-1)+Getsum(x1-1,y1-1);}int main(){    int newx,newy;    while(scanf("%d",&n) && n){        w=n*2;        scanf("%d",&m);        memset(c,0,sizeof c);        cnt=0;        for(int i=1;i<=m;i++){            scanf("%d%d%d%d",&p[i],&x[i],&y[i],&z[i]);            if(p[i]==1){                GetPoint(x[i],y[i],newx,newy);                Get_ready(newx,newy);            }        }        sort(h,h+cnt);        for(int i=1;i<=m;i++){            GetPoint(x[i],y[i],newx,newy);            if(p[i]==1)                update(newx,newy,z[i]);            else{                int x1,x2,y1,y2;                x1=max(1,newx-z[i]),x2=min(w,newx+z[i]);                y1=max(1,newy-z[i]),y2=min(w,newy+z[i]);                printf("%d\n",sum(x1,y1,x2,y2));            }        }    }}
0 0
原创粉丝点击