【树状数组】bzoj 1452 Count
2015-10-24 11:13
357 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1452
题目大意:给你一个n*m的棋盘,每个格子有一个颜色,有两种操作:1.改变某个格子的颜色 2.询问某个子矩阵中某种颜色格子的个数
看起来无从下手,但是数据里颜色数目巨小,于是对于每种颜色,开一个lowbit,可以直接水过去23333
第一次写数组开到205*305*305 直接MLE,整个人都不好了……
题目大意:给你一个n*m的棋盘,每个格子有一个颜色,有两种操作:1.改变某个格子的颜色 2.询问某个子矩阵中某种颜色格子的个数
看起来无从下手,但是数据里颜色数目巨小,于是对于每种颜色,开一个lowbit,可以直接水过去23333
[code]#include<iostream> #include<cstdio> using namespace std; int n,m,q; int a[105][305][305]; int mp[305][305]; int lowbit(int x) { return (x&(-x)); } void update(int x,int y,int col,int val) { for(int i = x;i <= n;i += lowbit(i)) for(int j = y;j <= m;j += lowbit(j)) a[col][i][j] += val; } int value(int x,int y,int col) { int p = 0; for(int i = x;i > 0;i -= lowbit(i)) for(int j = y;j > 0;j -= lowbit(j)) p += a[col][i][j]; return p; } int ans(int x1,int y1,int x2,int y2,int c) { x1 --; y1 --; int p = value(x2,y2,c); p -= value(x1,y2,c); p -= value(x2,y1,c); p += value(x1,y1,c); return p; } int main() { int k,x,y,x1,y1,x2,y2,c; scanf("%d%d",&n,&m); for(int i = 1;i <= n;i ++) for(int j = 1;j <= n;j ++) { scanf("%d",&x); update(i,j,x,1); mp[i][j] = x; } scanf("%d",&k); for(int i = 1;i <= k;i ++) { scanf("%d",&x); if(x == 1) { scanf("%d%d%d",&x,&y,&c); update(x,y,mp[x][y],-1); update(x,y,c,1); mp[x][y] = c; } else { scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c); printf("%d\n",ans(x1,y1,x2,y2,c)); } } return 0; }
第一次写数组开到205*305*305 直接MLE,整个人都不好了……
相关文章推荐
- 关于TI CCS版本
- hadoop 读书笔记(1)
- C#Monitor类 Lock Mutex类详解
- 光伏发电系列:关于光伏发电站的建设成本和资金回收周期
- [NOIP2003]加分二叉树
- windows下使用git和github建立远程仓库
- iOS 整理iOS9适配中出现的坑
- 连接服务器并接收数据
- 开启子线程
- Asp.Net MVC3.0如何项目部署到Win7 64位系统
- SAP 采购订单打印完后不可以取消审批
- Objective-C学习—UITableView的使用
- Reverse Linked List II - LeetCode
- JavaScript实现标题栏文字轮播效果代码
- MyEclipse 2014 下载与安装教程
- 51NOD1265(四点共面)
- OpenCV—图像椒盐噪声生成器
- 常用数据库系统简介
- 基于作业互评的新式评分方案(学生,教师可参考)
- [PYTHON]-用Scrapy爬虫遍历百度贴吧,本地保存文字版【PART 2】