首页 > 编程语言 > 详细

(二维树状数组)E - Stars

时间:2019-01-21 20:36:17      阅读:188      评论:0      收藏:0      [点我收藏+]

E - Stars

题意:B表示点亮改点,D表示熄灭,Q查询区间内亮的个数

Sample Input

5
B 581 145
B 581 145
Q 0 600 0 200
D 581 145
Q 0 600 0 200

AC代码:

技术分享图片
  1 #include <bits/stdc++.h>
  2 
  3 using namespace std;
  4 #define c_1(a) scanf("%d",&a)
  5 #define c_2(a,b) scanf("%d%d",&a,&b)
  6 #define c_3(a,b,c) scanf("%d%d%d",&a,&b,&c)
  7 
  8 #define min_2(a,b) a<b?a:b
  9 #define min_3(a,b,c) min_2(min_2(a,b),c)
 10 #define max_2(a,b) a>b?a:b
 11 #define max_3(a,b,c) max_2(max_2(a,b),c)
 12 #define ll long long
 13 #define rint register int
 14 #define mem0(x) memset(x, 0, sizeof(x))
 15 #define mem1(x) memset(x, -1, sizeof(x))
 16 #define lowbit(x)  x&-x
 17 
 18 //freopen("input.txt", "r", stdin);
 19 const double PI=acos(-1.0);
 20 const int inf = 0x3f3f3f3f;
 21 const ll inff = 0x3f3f3f3f3f3f3f3f;
 22 const int mod=1000000007;
 23 const int maxn=1e5+5;
 24 
 25 //map<ll,ll>mp;
 26 //set<ll>st;
 27 //stack<>st;
 28 //queue<>Q;
 29 /***********************************************/
 30 int a[1003][1003];
 31 int c[1003][1003];
 32 
 33 void add(int x,int y,int p)
 34 {
 35     if(p==1) a[x][y]=1;
 36     else a[x][y]=0;
 37     int j=y;
 38     while(x<=1001){
 39         y=j;
 40         while(y<=1001){
 41             c[x][y]+=p;
 42             y+=lowbit(y);
 43         }
 44         x+=lowbit(x);
 45     }
 46 }
 47 
 48 ll summ(int x,int y)
 49 {
 50     if(x<0 || y<0) return 0;
 51     ll ans=0;
 52     int j=y;
 53     while(x>0){
 54         y=j;
 55         while(y>0){
 56             ans+=c[x][y];
 57             y-=lowbit(y);
 58         }
 59         x-=lowbit(x);
 60     }
 61     return ans;
 62 }
 63 
 64 int main() 
 65 {
 66     int n;
 67     c_1(n);
 68     while(n--)
 69     {
 70         char s;
 71         int x1,x2,y1,y2;
 72         cin>>s;
 73         if(s==B)
 74         {
 75             //cin>>x1>>x2;
 76             scanf("%d%d",&x1,&x2);
 77             x1++,x2++;
 78             if(a[x1][x2]==0) add(x1,x2,1);
 79         }
 80         else if(s==D)
 81         {
 82             c_2(x1,x2);
 83             x1++,x2++;
 84             if(a[x1][x2]) add(x1,x2,-1);
 85         }
 86         else if(s==Q)
 87         {
 88             scanf("%d%d%d%d",&x1,&x2,&y1,&y2);
 89             x1++,x2++,y1++,y2++;
 90             int ans=0;
 91             if(x1<x2){
 92                 if(y1>y2)//4
 93                 ans=summ(x1-1,y2-1)-summ(x1-1,y1)-summ(x2,y2-1)+summ(x2,y1);
 94                 else
 95                 {//1
 96                     ans=summ(x1-1,y1-1)-summ(x1-1,y2)-summ(x2,y1-1)+summ(x2,y2);
 97                 }
 98                 
 99             }
100             else{
101                 if(y2>y1)//3
102                 ans=summ(x2-1,y1-1)-summ(x1,y1-1)-summ(x2-1,y2)+summ(x1,y2);
103                 else//2
104                 ans=summ(x1,y1)-summ(x1,y2-1)-summ(x2-1,y1)+summ(x2-1,y2-1);
105             }
106             printf("%d\n",ans);
107         }
108     }
109     return 0;
110 }
View Code

二维树状数组维护代码:

void add(int x,int y,int p)//在xy处修改,维护二维树状数组
{
	a[x][y]+=p;
	int j=y;
	while(x<=n){
		y=j;
		while(y<=n){
			c[x][y]+=p;
			y+=lowbit(y);
		}
		x+=lowbit(x);
	}
}
ll summ(int x,int y)//查询00 到 xy 区间的和
{
	if(x<0 || y<0) return 0;
	ll ans=0;
	int j=y;
	while(x>0){
		y=j;
		while(y>0){
			ans+=c[x][y];
			y-=lowbit(y);
		}
		x-=lowbit(x);
	}
	return ans;
}
只是把一维变二维,一样写
下图为此题笔记:(求两点表示的区间和时)

技术分享图片

 

 

(二维树状数组)E - Stars

原文:https://www.cnblogs.com/liuyongliu/p/10300717.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!