• 【POJ2155】Matrix-二维树状数组+前缀和


    题目大意:一个大小为N*N的矩阵,里面的元素只有0和1两种,刚开始矩阵里的元素都是0。有两种操作:1.把一个矩形区域内的元素进行修改,其中0修改成1,1修改成0。2.询问某一个点的元素值。对于每一个询问,给出正确的答案。

    做法:说起来比较困难,详细的可以查看这位大神的解释:点击打开链接

    以下是本人代码:

    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int t,n,m;
    long c[1010][1010]={0};
    
    int lowbit(int i)
    {
      return i&(-i);
    }
    
    void add(int x,int y)
    {
      for(int i=x;i<=n;i+=lowbit(i))
        for(int j=y;j<=n;j+=lowbit(j))
    	  c[i][j]++;
    }
    
    long sum(int x,int y)
    {
      long sm=0;
      if (!x||!y) return 0;
      for(int i=x;i>0;i-=lowbit(i))
        for(int j=y;j>0;j-=lowbit(j))
    	  sm+=c[i][j];
      return sm;
    }
    
    int main()
    {
      scanf("%d",&t);
      while(t>0)
      {
        memset(c,0,sizeof(c));
        scanf("%d %d
    ",&n,&m);
    	for(int i=1;i<=m;i++)
    	{
    	  char op;
    	  scanf("%c",&op);
    	  if (op=='C')
    	  {
    	    int l,b,r,t;
    	    scanf("%d %d %d %d
    ",&l,&b,&r,&t);
    		add(l,b);
    		add(l,t+1);
    		add(r+1,b);
    		add(r+1,t+1);
    	  }
    	  else
    	  {
    	    int x,y;
    	    scanf("%d %d
    ",&x,&y);
    		printf("%ld
    ",sum(x,y)%2);
    	  }
    	}
    	printf("
    ");
        t--;
      }
      
      return 0;
    }
    


  • 相关阅读:
    VB6 获取和设置默认打印机
    VB操作EXCEL文件大全
    VB常用字符串操作函数
    VB数组的清除
    清理系统内存
    转:清理系统垃圾的BAT代码
    对Kalman(卡尔曼)滤波器的理解
    Kernel Memory Layout on ARM Linux
    linux kernel内存映射实例分析
    基于ARM的模拟器
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793979.html
Copyright © 2020-2023  润新知