[JSOI2009]计数问题
一个n*m的方格,初始时每个格子有一个整数权值。接下来每次有2种操作: 改变一个格子的权值; 求一个子矩阵中某种特定权值出现的个数。 输入输出格式 输入格式:
第一行有两个数N,M。 接下来N行,每行M个数,第i+1行第j个数表示格子(i,j)的初始权值。 接下来输入一个整数Q。 之后Q行,每行描述一个操作。 操作1:“ x y c”(不含双引号)。表示将格子(x,y)的权值改成c(<=x<=n,<=y<=m,<=c<=)。 操作2:“ x1 x2 y1 y2 c”(不含双引号,x1<=x2,y1<=y2)。表示询问所有满足格子颜色为c,且x1<=x<=x2,y1<=y<=y2的格子(x,y)的个数。 输出格式:
对于每个操作2,按照在输入中出现的顺序,依次输出一行一个整数表示所求得的个数。
二维的点修改,区间查询,所以树状数组当然没得跑啦,二维的和一维的写法是一样的,只是传参的时候多传几个,循环的时候是2层循环而已,然后当然是权值树状数组开桶来记录个数啦。有一个需要注意的地方是,这里因为查询的是某个子矩阵中的某个数的个数,所以和一维的有一点不一样,这里需要像计算二维前缀和一样,先加一大块,再减两小块,在加上重复减的那个小小块。我会说我开始就是这里写错了吗
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,t,q,x,y,xx,yy,w,c[][][],a[][];
void update(int d,int x,int y,int w)
{ for(int i=x;i<=n;i+=i&-i)
for(int j=y;j<=m;j+=j&-j)
c[d][i][j]+=w;
}
int query(int d,int x,int y)
{ int ans=;
for(int i=x;i>;i-=i&-i)
for(int j=y;j>;j-=j&-j)
ans+=c[d][i][j];
return ans;
}
int main()
{ freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%d%d",&n,&m);
memset(c,,sizeof c);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)
{ scanf("%d",&a[i][j]);
update(a[i][j],i,j,);
}
scanf("%d",&q);
for(int i=;i<=q;i++)
{ scanf("%d",&t);
if(t==)
{ scanf("%d%d%d",&x,&y,&w);
update(a[x][y],x,y,-);
update(w,x,y,);
a[x][y]=w;
}else
{ scanf("%d%d%d%d%d",&x,&xx,&y,&yy,&w);
int ans=query(w,xx,yy)-query(w,x-,yy)-query(w,xx,y-)+query(w,x-,y-);
printf("%d\n",ans);
}
}
return ;
}
[JSOI2009]计数问题的更多相关文章
- 模板:二维树状数组 【洛谷P4054】 [JSOI2009]计数问题
P4054 [JSOI2009]计数问题 题目描述 一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入输出格式 ...
- 【题解】Luogu P4054 [JSOI2009]计数问题
原题传送门 我自闭了qaq 这道题非常简单,因为1<=c<=100,所以直接对每个c开二维树状数组,操作就跟模板一样 写码5分钟,调码半小时,这道题的输入顺序是x1,x2,y1,y2,我真 ...
- 洛谷4054 [JSOI2009]计数问题
原题链接 二维树状数组模板题. 对每一种颜色开一棵二维树状数组统计即可. #include<cstdio> using namespace std; const int N = 310; ...
- 洛谷P4054 [JSOI2009]计数问题(二维树状数组)
题意 题目链接 Sol 很傻x的题.. c才100, n, m才300,直接开100个二维树状数组就做完了.. #include<bits/stdc++.h> using namespac ...
- [JSOI2009]计数问题 二维树状数组
---题面--- 题解: 二维树状数组的板子题,,,学了这么久第一次写二维树状数组,惭愧啊. 怎么写就不说了,看代码吧. 跟普通的是一样的写法 #include<bits/stdc++.h> ...
- [JSOI2009]计数问题 二维树状数组BZOJ 1452
题目描述 一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入输出格式 输入格式: 第一行有两个数N,M. 接下来 ...
- [luogu4054 JSOI2009] 计数问题(2D BIT)
传送门 Solution 2D BIT模板 Code //By Menteur_Hxy #include <cmath> #include <cstdio> #include ...
- 【二维树状数组】计数问题 @JSOI2009/upcexam5911
时间限制: 1 Sec 内存限制: 128 MB 题目描述 一个n*m的方格,初始时每个格子有一个整数权值.接下来每次有2种操作: 改变一个格子的权值: 求一个子矩阵中某种特定权值出现的个数. 输入 ...
- 一些gcd计数问题
数论什么的全都忘光了吧QAQ 做了几道简单的题练习一下. bzoj1101: [POI2007]Zap 求有多少对数满足 gcd(x,y)=d, 1<=x<=a, 1<=y<= ...
随机推荐
- CentOS 源设置
安装完CentOS后,系统默认的源可能有限满,这时我们需要添加国内比较好的源. 一.国内比较好的源https://opsx.alibaba.com/mirror #阿 ...
- [USACO07JAN]平衡的阵容Balanced Lineup RMQ模板题
Code: #include<cstdio> #include<algorithm> using namespace std; const int maxn = 50000 + ...
- 【Henu ACM Round#14 A】Vitaly and Night
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 连续两个如果不全是0就递增cnt [代码] #include <bits/stdc++.h> using namespa ...
- [Javascript] this in Function Calls
In most cases, the value of a function's this argument is determined by how the function is called. ...
- HBase概念学习(八)开发一个类twitter系统之表设计
这边文章先将可能的需求分析一下,设计出HBase表,下一步再開始编写client代码. TwiBase系统 1.背景 为了加深HBase基本概念的学习,參考HBase实战这本书实际动手做了这个样例. ...
- C语言之基本算法39—字符串经典操作
//字符串概念! /* ================================================================== 题目:练习字符串的 1.输入输出 ...
- PipeCAD之管道标准库PipeStd
PipeCAD之管道标准库PipeStd eryar@163.com Key Words. PipeCAD, PipeStd, 管道设计软件,管件库 1. Introduction 前不久,两位老友徐 ...
- jQuery源码02--(3043 , 3183) Deferred : 延迟对象 : 对异步的统一管理
//延迟对象 jQuery.extend({ Deferred: function( func ) { var tuples = [//resolve完成.reject未完成.notify进行中类似于 ...
- 慢慢人生路,学点Jakarta基础-集合类
动态改变内存 因为数组在存储之前需要先申请一块连续的内存空间并且在编译的收就必须确定好它的空间大小,在运行时控件的大小无法再随着需求的改变而改变,极易出现越界的情况,数据少时又会造成内存空间浪费. 主 ...
- 49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序
原数据: 处理后的数据: 完整代码: //思路; //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据 ...