首页 > 代码库 > HDU 1892 See you~
HDU 1892 See you~
题意:
一块矩形空间 一开始每个格子都是1 有4种操作: S操作将(x1,y1)-(x2,y2)所画出的矩形中的数求和 A操作是在(x,y)加z D是在(x,y)减z 注意不能减成负数 M是移动
思路:
裸二维树状数组… POJ上有楼教主出过的题
代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 1001 int a[N+5][N+5]; int n,T,t; int lowbit(int x) { return x&(-x); } void add(int x,int y,int fd) { int i,j; for(i=x;i<=N;i+=lowbit(i)) { for(j=y;j<=N;j+=lowbit(j)) a[i][j]+=fd; } } int sum(int x,int y) { int i,j,res=0; for(i=x;i>0;i-=lowbit(i)) { for(j=y;j>0;j-=lowbit(j)) res+=a[i][j]; } return res; } int main() { int i,ux,uy,vx,vy,x,y; char op[5]; scanf("%d",&T); for(t=1;t<=T;t++) { memset(a,0,sizeof(a)); for(ux=1;ux<=N;ux++) { for(uy=1;uy<=N;uy++) add(ux,uy,1); } scanf("%d",&n); printf("Case %d:\n",t); while(n--) { scanf("%s",op); if(op[0]=='S') { scanf("%d%d%d%d",&ux,&uy,&vx,&vy); ux++,uy++,vx++,vy++; if(ux>vx) swap(ux,vx); if(uy>vy) swap(uy,vy); printf("%d\n",sum(vx,vy)+sum(ux-1,uy-1)-sum(ux-1,vy)-sum(vx,uy-1)); } else if(op[0]=='A') { scanf("%d%d%d",&ux,&uy,&x); ux++,uy++; add(ux,uy,x); } else if(op[0]=='D') { scanf("%d%d%d",&ux,&uy,&x); ux++,uy++; y=sum(ux,uy)+sum(ux-1,uy-1)-sum(ux-1,uy)-sum(ux,uy-1); if(y<x) x=y; add(ux,uy,-x); } else if(op[0]=='M') { scanf("%d%d%d%d%d",&ux,&uy,&vx,&vy,&x); ux++,uy++,vx++,vy++; y=sum(ux,uy)+sum(ux-1,uy-1)-sum(ux-1,uy)-sum(ux,uy-1); if(y<x) x=y; add(ux,uy,-x); add(vx,vy,x); } } } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。