2021算法竞赛入门班第九节课【线段树】练习题

题单地址:https://ac.nowcoder.com/acm/problem/collection/1265?asc=true&order=difficulty

情人节的电灯泡【二维树状数组 / 单点修改 区间查询】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int tr[N][N],a[N][N],n,m;
int lowbit(int x){
    
    return x&(-x);}
void add(int x,int y,int v)
{
    
    
	for(int i=x;i<=n;i+=lowbit(i))
		for(int j=y;j<=n;j+=lowbit(j)) tr[i][j]+=v;
}
int query(int x,int y)
{
    
    
	int sum=0;
	for(int i=x;i;i-=lowbit(i))
		for(int j=y;j;j-=lowbit(j)) sum+=tr[i][j];
	return sum;
}
int sum(int x,int y,int xx,int yy)
{
    
    
	return query(xx,yy)-query(x-1,yy)-query(xx,y-1)+query(x-1,y-1);
}
int main(void)
{
    
    
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j],add(i,j,a[i][j]);
	while(m--)
	{
    
    
		int op; cin>>op;
		if(op==1)
		{
    
    
			int x,y; cin>>x>>y;
			if(sum(x,y,x,y)) add(x,y,-1);//是1,变为0
			else add(x,y,1);//是0变为1
		}else
		{
    
    
			int x,y,xx,yy; cin>>x>>y>>xx>>yy;
			cout<<sum(x,y,xx,yy)<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/123699934