Bzoj1452 Count

http://www.lydsy.com/JudgeOnline/problem.php?id=1452

题目全是图片,不复制了。

开100个二维树状数组,分别记录区间内各个颜色的出现位置……

简单粗暴。

注意查询操作的读入顺序是x1 x2 y1 y2

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 using namespace std;
 8 const int mxn=310;
 9 int t[101][mxn][mxn];
10 int c[mxn][mxn];
11 int n,m;
12 inline int lowbit(int x){return x&-x;}
13 void add(int x,int y,int c,int v){
14     while(x<=n){
15         int tmp=y;
16         while(tmp<=m){t[c][x][tmp]+=v;tmp+=lowbit(tmp);}
17         x+=lowbit(x);
18     }
19 }
20 int smm(int x,int y,int c){
21     int res=0;
22     while(x){
23         int tmp=y;
24         while(tmp){res+=t[c][x][tmp];tmp-=lowbit(tmp);}
25         x-=lowbit(x);
26     }
27     return res;
28 }
29 int ask(int x1,int y1,int x2,int y2,int c){
30     return smm(x2,y2,c)+smm(x1-1,y1-1,c)-smm(x2,y1-1,c)-smm(x1-1,y2,c);
31 }
32 int main(){
33     int i,j;int x;
34     scanf("%d%d",&n,&m);
35     for(i=1;i<=n;i++)
36         for(j=1;j<=m;j++){
37             scanf("%d",&x);
38             c[i][j]=x;
39             add(i,j,x,1);
40         }
41     int Q;
42     scanf("%d",&Q);
43     int x1,y1,x2,y2;
44     while(Q--){
45         scanf("%d",&i);
46         if(i==1){
47             scanf("%d%d%d",&x1,&y1,&x);
48             add(x1,y1,c[x1][y1],-1);
49             c[x1][y1]=x;
50             add(x1,y1,c[x1][y1],1);
51         }
52         else{
53             scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&x);
54             printf("%d\n",ask(x1,y1,x2,y2,x));
55         }
56     }
57     return 0;
58 }
时间: 2024-10-14 00:24:24

Bzoj1452 Count的相关文章

BZOJ1452 count (树状数组)

一道比较水的二维树状数组,开100个即可,只有100种颜色还是比较EZ的. 1 Program BZOJ1452; 2 const maxn=308; 3 maxc=108; 4 var a:array[0..maxn,0..maxn,0..maxc] of longint; 5 f:array[0..maxn,0..maxn] of longint; 6 m,n,i,j,x,y,x1,y1,x2,y2,z,Q,ch,sum:longint; 7 procedure add(i,j,c,k:lo

nodejs api 中文文档

文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格式 目录 关于本文档 稳定度 JSON 输出 概述 全局对象 global process console 类: Buffer require() require.resolve() require.cache require.extensions __filename __dirname module e

[bzoj1452][JSOI2009]Count(树状数组)

1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2057  Solved: 1216[Submit][Status][Discuss] Description Input Output Sample Input Sample Output 1 2 HINT Source 裸得不能再裸了 暴力100个二维即可 1 #include<stdio.h> 2 #include<stdlib.h> 3

【BZOJ-1452】Count 树状数组 套 树状数组

1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1769  Solved: 1059[Submit][Status][Discuss] Description Input Output Sample Input Sample Output 1 2 HINT Source Solution 忽略标题的说法...撞壁用的.... 简单题,裸树状数组套树状数组 颜色数目$c<=100$很小,考虑对于每种颜色单独进

[bzoj1452] [JSOI2009]Count

来自FallDream的博客,未经允许,请勿转载,谢谢. 有一个n*m的矩阵,每个点有一个权值. 需要支持两种操作:1)改变一个点的权值2)查询一个矩形内权值为c的个数 n,m<=300 q<=200000 权值<=100 权值有点小吧?那就每种权值开一个二维树状数组呗 #include<cstdio> #include<iostream> #define MN 300 using namespace std; inline int read() { int x=

BZOJ1452 [JSOI2009]Count Solution

题意:自行脑补 做法:直接开权值那么多的二维树状数组暴力. Code: #include <cstdio> #include <cctype> #include <iostream> #include <algorithm> using namespace std; inline int getc() { static const int L = 1 << 15; static char buf[L], *S = buf, *T = buf; i

【二维树状数组】bzoj1452 [JSOI2009]Count

权值的种类只有100种,对每种开个二维BIT,然后是经典操作. 1 #include<cstdio> 2 using namespace std; 3 int n,m,q,x1,y1,x2,y2,val,op,a[301][301]; 4 struct BIT_2D 5 { 6 int d[301][301]; 7 void update(int x,const int &y,const int &V) 8 { 9 for(;x<=n;x+=(x&(-x))) 1

c#数组的count()和length的区别

C# 数组中 Length 表示数组项的个数,是个属性. 而 Count() 也是表示项的个数,是个方法,它的值和 Length 一样.但实际上严格地说 Count() 不是数组的内容,而是 IEnumerable 的内容.这也是为什么 C# 2.0 时数组不能用 Count(),而 3.0 后就可以用 Count() 的原因. 对于数组,据说用 Length 快于 Count(). 所以一般情况:数组我用 Length,IEnumerable(比如 List)我用 Count().

[LeetCode]Count Primes

题目:Count Primes 统计1-n的素数的个数. 思路1: 通常的思想就是遍历(0,n)范围内的所有数,对每个数i再遍历(0,sqrt(i)),每个除一遍来判断是否为素数,这样时间复杂度为O(n*sqrt(n)). 具体实现不在贴代码,过程很简单,两重循环就可以解决.但是效率很差,n较大时甚至会花几分钟才能跑完. 思路2: 用埃拉特斯特尼筛法的方法来求素数,时间复杂度可以达到O(nloglogn). 首先开一个大小为n的数组prime[],从2开始循环,找到一个质数后开始筛选出所有非素数