[BZOJ1452][JSOI2009]Count(二维树状数组)
2016-04-05 07:44
513 查看
题目描述
传送门题解
数据范围很小,那么给每一个不同的权值建一个二维树状数组。其余查询照旧。
代码
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int max_n=305; const int max_opt=105; int n,m,q,x,y,c,x1,y1,x2,y2,opt; int ans,ans1,ans2,ans3,ans4; int a[max_n][max_n]; int C[max_opt][max_n][max_n]; inline void add(int loc1,int loc2,int opt,int val){ for (int i=loc1;i<=n;i+=i&(-i)) for (int j=loc2;j<=m;j+=j&(-j)) C[opt][i][j]+=val; } inline int query(int loc1,int loc2,int opt){ int ans=0; for (int i=loc1;i>=1;i-=i&(-i)) for (int j=loc2;j>=1;j-=j&(-j)) ans+=C[opt][i][j]; return ans; } int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j){ scanf("%d",&x); a[i][j]=x; add(i,j,a[i][j],1); } scanf("%d",&q); for (int i=1;i<=q;++i){ scanf("%d",&opt); if (opt==1){ scanf("%d%d%d",&x,&y,&c); add(x,y,a[x][y],-1); a[x][y]=c; add(x,y,a[x][y],1); } else{ scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c); ans1=query(x2,y2,c); ans2=query(x1-1,y1-1,c); ans3=query(x1-1,y2,c); ans4=query(x2,y1-1,c); ans=ans1-ans3-ans4+ans2; printf("%d\n",ans); } } }
总结
认真读题!!!相关文章推荐
- 学习总结HTML CSS JAVASCRIPT,对三剑客的一些理解
- javascript中运算符有哪些? 他们的优先级 呢?
- javascript--aop实现
- JSONP处理同源策略
- JSP页面传值乱码过滤方法
- JSP入门教程之基本语法简析
- JSP页面间传值问题实例简析
- JS+CSS实现闪烁字体效果代码
- JavaScript图像延迟加载库Echo.js
- JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
- JS简单编号生成器实现方法(附demo源码下载)
- javascript HTML5 canvas实现打砖块游戏
- JS中的forEach、$.each、map方法推荐
- JS模拟简易滚动条效果代码(附demo源码)
- JavaScript数组去重的两种方法推荐
- javascript中apply、call和bind的使用区别
- js老生常谈之this,constructor ,prototype全面解析
- JavaScriptCore学习之JavaScriptCore
- js 精度数据处理
- JavaScript编程题(含腾讯2016校招题)