题目:洛谷P4390、BZOJ1176。

题目大意:

给你一个\(W\times W\)的矩阵,初始每个数都为\(S\)。现在有若干操作:

1. 给某个格子加上一个值;
2. 询问某个子矩阵的值的和;
3. 结束询问

解题思路:

CDQ分治。

离线操作,把询问拆成4个矩阵(二维前缀和)。

对\(x\)轴排序,分治询问,用左区间的修改来更新右区间的询问。由于\(x\)已被排序,我们直接用树状数组维护\(y\)的前缀和即可。

也可以边CDQ边归并排序。

时间复杂度\(O(n\log^2 n)\)。

C++ Code:

#include<cstdio>
#include<algorithm>
#include<cctype>
#define LoveLive long long
#define M 2000005
int S,W,cnt=0;
LoveLive bit[M];
inline int readint(){
int c=getchar(),d=0,f=0;
for(;!isdigit(c);c=getchar())f=c=='-';
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return f?-d:d;
}
struct Qs{
int type,x,y,id;LoveLive num;//type 0: modify; type 1: query.
inline bool operator<(const Qs&rhs)const{return id<rhs.id;}
}q[200020],t[200020];
inline void add(int x,LoveLive y){for(int i=x;i<M;i+=i&-i)bit[i]+=y;}
inline LoveLive ask(int x){LoveLive ans=0;for(int i=x;i;i-=i&-i)ans+=bit[i];return ans;}
inline void clear(int x){for(int i=x;i<M;i+=i&-i)bit[i]=0;}
void cdq(int l,int r){
if(l<r){
int mid=l+r>>1;
cdq(l,mid),cdq(mid+1,r);
int a=l,b=mid+1,c=l;
while(a<=mid&&b<=r){
if(q[a].x<=q[b].x){
if(!q[a].type)add(q[a].y,q[a].num);
t[c++]=q[a++];
}else{
if(q[b].type)q[b].num+=ask(q[b].y);
t[c++]=q[b++];
}
}
while(a<=mid){
if(!q[a].type)add(q[a].y,q[a].num);
t[c++]=q[a++];
}
while(b<=r){
if(q[b].type)q[b].num+=ask(q[b].y);
t[c++]=q[b++];
}
for(int i=l;i<=mid;++i)if(!q[i].type)clear(q[i].y);
for(int i=l;i<=r;++i)q[i]=t[i];
}
}
int main(){
S=readint(),W=readint();
for(int opt=readint();opt^3;opt=readint()){
if(opt==1){
int x=readint(),y=readint(),p=readint();
++cnt;
q[cnt]=(Qs){0,x,y,cnt,p};
}else{
int x1=readint(),y1=readint(),x2=readint(),y2=readint();
++cnt;q[cnt]=(Qs){1,x1-1,y1-1,cnt,0};
++cnt;q[cnt]=(Qs){1,x1-1,y2,cnt,0};
++cnt;q[cnt]=(Qs){1,x2,y1-1,cnt,0};
++cnt;q[cnt]=(Qs){1,x2,y2,cnt,0};
}
}
cdq(1,cnt);
std::sort(q+1,q+cnt+1);
for(int i=1;i<=cnt;++i)
if(q[i].type){
printf("%d\n",int(q[i+3].num-q[i+2].num-q[i+1].num+q[i].num+1ll*S*(q[i+3].y-q[i].y)*(q[i+3].x-q[i].x)));i+=3;
}
return 0;
}

最新文章

  1. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
  2. Daily Scrum Meeting ——TenthDay
  3. Angular JS 学习之Bootstrap
  4. Tastypie 学习笔记
  5. Java中获取长度length和size的问题
  6. Oracle帮助类
  7. show slave status
  8. (转)HTML5开发学习(3):本地存储之Web Sql Database
  9. sqlserver跟踪
  10. 【转】Java Thread.join()详解
  11. ASP.NET事务存储过程
  12. mysql之 mysql 5.6不停机主从搭建(一主一从)
  13. 浅谈MVC MVP MVVM
  14. meta 元标签的常用用法
  15. /etc/init.d/sshd配置SSHD路径忘记修改导致启动失败
  16. SQL进阶1:case表达式的用法示例
  17. Android Studio updating indices 一直刷新和闪烁
  18. reload maven project&#39; has encountered a proble&quot; 问题
  19. webpack安装整理
  20. linux环境安装nagiosgraph将nagios的性能数据绘制成动态图表?

热门文章

  1. Oracle 知识积累
  2. 【JavaScript框架封装】实现一个类似于JQuery的DOM框架的封装
  3. linux github 添加ssh
  4. USB OTG学习笔记
  5. 题解 ZOJ3203 Light Bulb
  6. 从MySQL临时表谈到filesort
  7. 《Python 源码阅读》之 类型Type
  8. 组件的使用(三)AutoCompleteTextView的使用
  9. 4种方法让SpringMVC接收多个对象
  10. iOS开发一行代码系列:一行搞定输入框