BZOJ 1452 JSOI 2009 Count 二维树状数组
来源:互联网 发布:stc15f2k单片机下载线 编辑:程序博客网 时间:2024/06/06 19:01
题目大意:有一个m*n的方格,每一个格子有他自己的权值。2种操作:
1.改变一个格子的权值。
2.查询所有的x1 <= x <= x2 && y1 <= y <= y2的中,有多少个格子颜色是c。
思路:好像是二维树状数组的样子,但是不知道怎么搞。后来研究了数据范围,发现格子最大300*300,颜色最多才100种,于是算一下300*300*100*4/1024/1024大概是35M,题目要求64M,可以搞了。(这里算的精确一点,我当时没怎么算,吧颜色开成300的了,结果100+M就MLE了。。)
维护100个二维树状数组,每一个代表一种颜色,然后根据容斥原理计算一个方块区间内的数量。更改的时候要改两次,第一次把之前的减去,然后加上改变之后的。
CODE:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAX 310using namespace std;int m,n;struct Complex{ int tree[MAX][MAX]; void Fix(int x,int y,int c) { for(int i = x;i <= m;i += i&-i) for(int j = y;j <= n;j += j&-j) tree[i][j] += c; } int GetSum(int x,int y) { int re = 0; for(int i = x;i;i -= i&-i) for(int j = y;j;j -= j&-j) re += tree[i][j]; return re; }}tree_arr[110];int src[MAX][MAX];int asks;int main(){ cin >> m >> n; for(int i = 1;i <= m; ++i) for(int j = 1;j <= n; ++j) { scanf("%d",&src[i][j]); tree_arr[src[i][j]].Fix(i,j,1); } cin >> asks; for(int flag,i = 1;i <= asks; ++i) { scanf("%d",&flag); if(flag == 1) { int x,y,z; scanf("%d%d%d",&x,&y,&z); tree_arr[src[x][y]].Fix(x,y,-1); src[x][y] = z; tree_arr[src[x][y]].Fix(x,y,1); } else { int x1,y1,x2,y2,c; scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c); int ans = tree_arr[c].GetSum(x2,y2); ans -= tree_arr[c].GetSum(x1 - 1,y2); ans -= tree_arr[c].GetSum(x2,y1 - 1); ans += tree_arr[c].GetSum(x1 - 1,y1 - 1); printf("%d\n",ans); } } return 0;}
0 0
- BZOJ 1452 JSOI 2009 Count 二维树状数组
- BZOJ 1452 [JSOI2009]Count 二维树状数组
- BZOJ 1452: [JSOI2009]Count 二维树状数组
- BZOJ 1452: [JSOI2009]Count 二维树状数组
- BZOJ 1452: [JSOI2009]Count (二维树状数组)
- 【bzoj 1452】[JSOI2009]Count(二维树状数组)
- 二维树状数组(bzoj 1452: [JSOI2009]Count)
- [二维树状数组]BZOJ 1452—— [JSOI2009]Count
- 【BZOJ】【P1452】【JSOI2009】【Count】【二维树状数组】
- 【树状数组】bzoj 1452 Count
- [bzoj 1452] Count (树状数组)
- bzoj 1452 二维树状数组
- 1452: [JSOI2009]Count 二维树状数组
- |BZOJ 1452|树状数组|[JSOI2009]Count
- bzoj 3132 二维树状数组
- 【BZOJ1452】【JSOI2009】Count 二维树状数组
- BZOJ1452 [JSOI2009]Count(二维树状数组)
- BZOJ_P1452 [JSOI2009]Count(二维树状数组)
- 不使用sizeof(),判断当前系统是16位或者32位
- 【Struts2学习笔记(6)】Action动态方法调用
- hdu-1022 栈的应用。
- Linux中profile、bashrc、bash_profile之间的区别和联系
- 用setup.py安装Scrapy
- BZOJ 1452 JSOI 2009 Count 二维树状数组
- 让你的程序更优雅的sleep
- 【取对数+科学计数法】【HDU1060】 N^N
- poj2653-Pick-up sticks(线段相交问题)
- hdu-1247 简单map的应用。(字典树)
- python 在不同层级目录import 模块的方法
- 关于JAVA 参数传递理解
- java list概要
- C++类对象大小的计算(二)含有虚函数类大小计算