情人节的电灯泡 树状数组统计矩阵

情人节的电灯泡

https://ac.nowcoder.com/acm/problem/15172

水题。

#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long 
using namespace std;
ll tree[1000050],a[1000050],n,m,ans,x;
ll lowbit(ll x)
{
    return x&-x;    
} 
void add(ll i,ll x)
{
    while(i<=n*n)
    {
        tree[i]+=x;
        i+=lowbit(i);
    }
}
ll sum(ll i)
{
    ll res=0;
    while(i>0)
    {
        res+=tree[i];
        i-=lowbit(i);
    }
    return res;    
}
ll range_sum(ll l,ll r)
{
    return sum(r)-sum(l-1);
}
int main()
{
    ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);
      cin>>n>>m;
      for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
      {
          cin>>a[(i-1)*n+j];
        if(a[(i-1)*n+j]==1)add((i-1)*n+j,1);
    }
    while(m--)
    {
        int  flag=0;cin>>flag;
        if(flag==1){
            int x1,y1;cin>>x1>>y1;
            if(a[(x1-1)*n+y1]==1){
                a[(x1-1)*n+y1]=0;
                add((x1-1)*n+y1,-1);
            }
            else if(a[(x1-1)*n+y1]==0){
                a[(x1-1)*n+y1]=1;
                add((x1-1)*n+y1,1);
            }
        }
        else if(flag==2){
            int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;
            ll ans=0;
            for(int i=x1;i<=x2;i++)
            ans+=range_sum((i-1)*n+y1,(i-1)*n+y2);
            cout<<ans<<endl;
        }
    }
    return 0;
}
全部评论

相关推荐

4 收藏 评论
分享
牛客网
牛客企业服务