HDU 2642 Stars [二维树状数组]【数据结构】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2642 —————————————————————————————–. Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/65536 K (Java/Others) Problem Description There is only one case. Input Output Sample Input Sample Output Author Source —————————————————————————————–. 题目大意: 解题思路: 思路上没有什么可说的,因为是动态的 所以必须是二维树状数组,维护即可 注意的是 ,同一坐标下最多只能有一个星星,删除的话这个坐标就没有星星了 注意 做题的时候注意下坐标的范围 ,因为是从0开始那么计算的时候所有坐标都要加1 否则的话会无限TLE 附本题代码 #include <bits/stdc++.h>
#define abs(x) (((x)>0)?(x):-(x))
#define lalal puts("*********")
#define Rep(a,b,c) for(int a=(b);a<=(c);a++)
#define Req(a,c) for(int a=(b);a>=(c);a--)
#define Rop(a,c) for(int a=(b);a<(c);a++)
#define s1(a) scanf("%d",&a)
typedef long long int LL;
using namespace std;
/**************************************/
const int N = 1000+5;
#define lowbit(x) (x&-x)
LL sum[N][N];
bool h[N][N];
void update(int xi,int yi,int val){
for(int i=xi;i<=N;i+=lowbit(i))
for(int j=yi;j<=N;j+=lowbit(j))
sum[i][j]+=val;
return;
}
int getSum(int xi,int yi){
int ans = 0;
for(int i=xi;i>0;i-=lowbit(i))
for(int j=yi;j>0;j-=lowbit(j))
ans+=sum[i][j];
return ans ;
}
int main(){
int n;
while(~s1(n)){
memset(sum,0,sizeof(sum));
memset(h,sizeof(h));
char ch;
int x1,y1,x2,y2;
int tem;
while(n--){
getchar();
scanf("%c",&ch);
if('B'==ch){
s1(x1),s1(y1);
x1++,y1++;
if(h[x1][y1]) continue;
update(x1,1);
h[x1][y1]=1;
}
else if('D'==ch){
s1(x1),y1++;
if(h[x1][y1]) update(x1,-1);
h[x1][y1]=0;
}
else {
s1(x1),s1(x2),s1(y1),s1(y2);
x1++,y1++,x2++,y2++;
if(x1>x2) swap(x1,x2);
if(y1>y2) swap(y1,y2);
tem=getSum(x2,y2)-getSum(x2,y1-1)-getSum(x1-1,y2)+getSum(x1-1,y1-1);
printf("%dn",tem);
}
}
}
return 0;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |