Problem F

发布时间: 2017年6月28日 10:31   最后更新: 2017年6月29日 21:35   时间限制: 2000ms   内存限制: 64M

描述

给定一个n×m的矩形, 初始时所有元素都为0

给出q个操作, 操作有三种

对于形如1 x的操作, 将第x行的所有元素异或1

对于形如2 y的操作, 将第y列的所有元素异或1

对于形如3 x1 y1 x2 y2的操作, 输出(x1,y1)-(x2,y2)这段矩形区域内1的个数

9×105≤n≤106, 9×105≤m≤106, 9×105≤q≤106

输入

第一行三个整数n, m, q, 意义如上所述。
接下来q行, 每行第一个数为opt, 如果opt=1或opt=2, 后面紧跟一个数, 意义如上所述; 如果opt=3, 后面紧跟四个数, 意义如上所述。

输出

对于每个操作3, 输出答案, 一行一个。

样例输入1 复制

4 4 5
3 1 1 4 4
1 4
3 1 1 4 4
2 4
3 1 1 4 4

样例输出1

0
4
6

大水题一道,我们知道,异或的特性如果有1个数,他本身进行偶数次异或那么就是0;

这道题我们这样想,对于一行来说,异或奇数次是一样的,异或偶数次也是一样的。

那么这个问题就可以简化,我们按行建一个树状数组,里面保存有多少行的 异或次数为奇数次。

我们再按照列建一个树状数组,里面保存有多少列的异或次数为奇数次。

那么要求矩阵x1,x2,y1,y2里的1的个数,1的个数就等于(row[x2]-row[x1-1])*(y2-y1+1) + (col[y2] - col[y1-1])*(x2-x1+1) - 2*(row[x2]-row[x1-1])*(row[x2]-row[x1-1])

其中row[i]与col[i]都可以log(n)时间内用树状数组求出来

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAX = 1e6+7;
int row[MAX];
int mark_row[MAX];
int mark_col[MAX];
int col[MAX];
int n,m,q;
inline int lowbit(int x){return x & (-x);
}
void add(int in[],int pos,int val){while(pos <= MAX){in[pos] += val;pos += lowbit(pos);}
}
int getsum(int in[],int pos){int res = 0;while(pos){res += in[pos];pos -= lowbit(pos);}return res;
}
int main(){scanf("%d%d%d",&n,&m,&q);while(q--){int opt;scanf("%d",&opt);if(opt == 1){int x;scanf("%d",&x);if(mark_row[x]){add(row,x,-1);mark_row[x] = 0;}else{add(row,x,1);mark_row[x] = 1;}}else if(opt == 2){int x;scanf("%d",&x);if(mark_col[x]){add(col,x,-1);mark_col[x] = 0;}else{add(col,x,1);mark_col[x] = 1;}}else{int x1,x2,y1,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);int ans1 = getsum(row,x2) - getsum(row,x1-1);int ans2 = getsum(col,y2) - getsum(col,y1-1);int ans = ans1*(y2-y1+1) + ans2*(x2-x1+1) - 2*ans1*ans2;printf("%d\n",ans);}}return 0;
}

2017西安交大ACM小学期数据结构 [又是树状数组、异或]相关推荐

  1. 2017西安交大ACM小学期数据结构 [线段树]

    Problem B+ 发布时间: 2017年7月1日 02:08   最后更新: 2017年7月1日 02:10   时间限制: 1000ms   内存限制: 64M 描述 给定一个长度为n的序列a1 ...

  2. 2017西安交大ACM小学期数据结构 [树状数组 离散化]

    Problem E 发布时间: 2017年6月28日 12:53   最后更新: 2017年6月29日 21:35   时间限制: 1000ms   内存限制: 64M 描述 给定一个长度为n的序列a ...

  3. 2017西安交大ACM小学期数据结构 [树状数组,极大值]

    Problem D 发布时间: 2017年6月28日 10:51   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  4. 2017西安交大ACM小学期数据结构 [树状数组]

    Problem C 发布时间: 2017年6月28日 11:38   最后更新: 2017年6月28日 16:38   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  5. 2017西安交大ACM小学期数据结构 [分块、二维矩阵]

    Problem B 发布时间: 2017年6月28日 10:06   最后更新: 2017年6月28日 16:35   时间限制: 2000ms   内存限制: 32M 描述 给定一个n×m的矩形, ...

  6. 2017西安交大ACM小学期数据结构 [分块,区间修改,单点查询]

    Problem A 发布时间: 2017年6月28日 09:29   最后更新: 2017年6月28日 13:03   时间限制: 1000ms   内存限制: 32M 描述 给定一个长度为n的序列a ...

  7. 2017西安交大ACM小学期 有趣异或[Trie树]

    有趣异或 发布时间: 2017年7月4日 23:59   最后更新: 2017年7月5日 14:56   时间限制: 1500ms   内存限制: 512M 描述 给定n个非负整数,保证这些数两两不相 ...

  8. 2017西安交大ACM小学期 敏感词汇[AC自动机]

    敏感词汇 发布时间: 2017年7月5日 00:23   最后更新: 2017年7月6日 14:40   时间限制: 1500ms   内存限制: 128M 描述 我们知道,在进行聊天时,有些词汇是敏 ...

  9. 2017西安交大ACM小学期 文本查找[AC自动机]

    文本查找 发布时间: 2017年7月5日 00:10   最后更新: 2017年7月5日 13:47   时间限制: 1500ms   内存限制: 128M 描述 给定m种两两不同的关键词,并给定一段 ...

最新文章

  1. HBase保存的各个字段意义解释
  2. selenium webdriver python 环境搭建
  3. pycharm 使用anaconda python编译器时添加available packages 显示nothing to show的解决办法
  4. LeetCode(合集)两数之和总结 (1,167,1346)
  5. 【Codeforces 631C 】Report(单调栈,思维模拟)
  6. [CityLife]“背后的故事”---贫嘴曾志伟
  7. 突破开源Redis的内存限制,存算分离的GaussDB到底有多能“装”?
  8. 【完美】SpringBoot中使用注解来实现 Redis 分布式锁
  9. preg_match 参数获取两个_「死磕 Spring」—– IOC 之 获取 Document 对象
  10. Numpy——numpy的基本运算
  11. 不同环境配置Django
  12. 主干网络系列(2) -ResNet V2:深度残差网络中的恒等映射
  13. 跨语言调用模块.TXT
  14. Spring核心包介绍
  15. 来自阿里十余年的老架构师自述:成为架构师你只差了一步
  16. matlab 椭圆参数传递,用MATLAB绘图已知椭圆参数方程
  17. 在Win32中使用OpenGL
  18. php微信一次性订阅消息demo,微信一次性订阅消息
  19. Dynamodb 备份方案
  20. 推荐系统中的pointwise和pairwise区别

热门文章

  1. 获取html滚动条位置,pc和移动端获取滚动条的位置
  2. acwing2041. 干草堆(差分数组)
  3. Java当中 文件得输入流 输出流
  4. 队列的定义与操作-顺序存储,链式存储(C语言)
  5. LeetCode 24两两交换链表中的节点-中等
  6. Zookeeper实践与应用- Canal
  7. mpu 配置内存空间_mpu内存保护单元功能及工作原理
  8. linux关机方法有哪些?有何区别_Linux下判断是否正常关机的一个简单方法
  9. python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...
  10. 常用查找算法(顺序、折半、二叉树、哈希、分块)介绍