2017西安交大ACM小学期数据结构 [又是树状数组、异或]
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, 输出答案, 一行一个。
4 4 5 3 1 1 4 4 1 4 3 1 1 4 4 2 4 3 1 1 4 4
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小学期数据结构 [又是树状数组、异或]相关推荐
- 2017西安交大ACM小学期数据结构 [线段树]
Problem B+ 发布时间: 2017年7月1日 02:08 最后更新: 2017年7月1日 02:10 时间限制: 1000ms 内存限制: 64M 描述 给定一个长度为n的序列a1 ...
- 2017西安交大ACM小学期数据结构 [树状数组 离散化]
Problem E 发布时间: 2017年6月28日 12:53 最后更新: 2017年6月29日 21:35 时间限制: 1000ms 内存限制: 64M 描述 给定一个长度为n的序列a ...
- 2017西安交大ACM小学期数据结构 [树状数组,极大值]
Problem D 发布时间: 2017年6月28日 10:51 最后更新: 2017年6月28日 16:38 时间限制: 1000ms 内存限制: 32M 描述 给定一个长度为n的序列a ...
- 2017西安交大ACM小学期数据结构 [树状数组]
Problem C 发布时间: 2017年6月28日 11:38 最后更新: 2017年6月28日 16:38 时间限制: 1000ms 内存限制: 32M 描述 给定一个长度为n的序列a ...
- 2017西安交大ACM小学期数据结构 [分块、二维矩阵]
Problem B 发布时间: 2017年6月28日 10:06 最后更新: 2017年6月28日 16:35 时间限制: 2000ms 内存限制: 32M 描述 给定一个n×m的矩形, ...
- 2017西安交大ACM小学期数据结构 [分块,区间修改,单点查询]
Problem A 发布时间: 2017年6月28日 09:29 最后更新: 2017年6月28日 13:03 时间限制: 1000ms 内存限制: 32M 描述 给定一个长度为n的序列a ...
- 2017西安交大ACM小学期 有趣异或[Trie树]
有趣异或 发布时间: 2017年7月4日 23:59 最后更新: 2017年7月5日 14:56 时间限制: 1500ms 内存限制: 512M 描述 给定n个非负整数,保证这些数两两不相 ...
- 2017西安交大ACM小学期 敏感词汇[AC自动机]
敏感词汇 发布时间: 2017年7月5日 00:23 最后更新: 2017年7月6日 14:40 时间限制: 1500ms 内存限制: 128M 描述 我们知道,在进行聊天时,有些词汇是敏 ...
- 2017西安交大ACM小学期 文本查找[AC自动机]
文本查找 发布时间: 2017年7月5日 00:10 最后更新: 2017年7月5日 13:47 时间限制: 1500ms 内存限制: 128M 描述 给定m种两两不同的关键词,并给定一段 ...
最新文章
- HBase保存的各个字段意义解释
- selenium webdriver python 环境搭建
- pycharm 使用anaconda python编译器时添加available packages 显示nothing to show的解决办法
- LeetCode(合集)两数之和总结 (1,167,1346)
- 【Codeforces 631C 】Report(单调栈,思维模拟)
- [CityLife]“背后的故事”---贫嘴曾志伟
- 突破开源Redis的内存限制,存算分离的GaussDB到底有多能“装”?
- 【完美】SpringBoot中使用注解来实现 Redis 分布式锁
- preg_match 参数获取两个_「死磕 Spring」—– IOC 之 获取 Document 对象
- Numpy——numpy的基本运算
- 不同环境配置Django
- 主干网络系列(2) -ResNet V2:深度残差网络中的恒等映射
- 跨语言调用模块.TXT
- Spring核心包介绍
- 来自阿里十余年的老架构师自述:成为架构师你只差了一步
- matlab 椭圆参数传递,用MATLAB绘图已知椭圆参数方程
- 在Win32中使用OpenGL
- php微信一次性订阅消息demo,微信一次性订阅消息
- Dynamodb 备份方案
- 推荐系统中的pointwise和pairwise区别
热门文章
- 获取html滚动条位置,pc和移动端获取滚动条的位置
- acwing2041. 干草堆(差分数组)
- Java当中 文件得输入流 输出流
- 队列的定义与操作-顺序存储,链式存储(C语言)
- LeetCode 24两两交换链表中的节点-中等
- Zookeeper实践与应用- Canal
- mpu 配置内存空间_mpu内存保护单元功能及工作原理
- linux关机方法有哪些?有何区别_Linux下判断是否正常关机的一个简单方法
- python可变参数和关键字参数位置_python中函数的默认参数和可变长参数如何排列?...
- 常用查找算法(顺序、折半、二叉树、哈希、分块)介绍