维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.

Input

第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小

接下来每行为一下三种输入之一(不包含引号):

"1 x y a"

"2 x1 y1 x2 y2"

"3"

输入1:你需要把(x,y)(第x行第y列)的格子权值增加a

输入2:你需要求出以左下角为(x1,y1),右上角为(x2,y2)的矩阵内所有格子的权值和,并输出

输入3:表示输入结束

Output

对于每个输入2,输出一行,即输入2的答案

Sample Input0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output3
5Hint

保证答案不会超过int范围

思路:三元偏序问题,CDQ分治,(time,x,y),将每一次查询拆成四个点即可,初始值预处理一下就行

using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL; const int maxm = 2e6+; int C[maxm], S, W, ans[maxm]; void add(int x, int val) {
for(; x <= maxm; x += lowbit(x))
C[x] += val;
} int getsum(int x) {
int ret = ;
for(; x; x -= lowbit(x))
ret += C[x];
return ret;
} void clearr(int x) {
for(; x <= maxm; x += lowbit(x)) {
if(C[x] == ) break;
C[x] = ;
}
} struct Node {
int type, tim, x, y, w, id;
} buf[maxm], res[maxm]; bool cmp_S(Node a, Node b) {
if(a.tim == b.tim && a.x == b.x) return a.y < b.y;
if(a.tim == b.tim) return a.x < b.x;
return a.tim < b.tim;
} void CDQ(int L, int R) {
if(L >= R) return;
int mid = L+R >> ;
CDQ(L, mid), CDQ(mid+, R);
int i = L, j = mid+, k = L;
//左修改右查询
while(i <= mid && j <= R) {
if(res[i].x <= res[j].x) {
if(res[i].type == )
add(res[i].y, res[i].w);
buf[k++] = res[i++];
} else {
if(res[j].type == )
ans[res[j].id] += getsum(res[j].y) * res[j].w;
buf[k++] = res[j++];
}
}
while(i <= mid)
buf[k++] = res[i++];
while(j <= R) {
ans[res[j].id] += getsum(res[j].y) * res[j].w;
buf[k++] = res[j++];
}
for(int t = L; t <= R; ++t) {
clearr(buf[t].y); // 清空树状数组
res[t] = buf[t];
}
} int main() {
scanf("%d%d", &S, &W);
int type, sz = , x1, x2, y1, y2, tim = , query = ;
while(scanf("%d", &type) && type != ) {
if(type == ) {
scanf("%d%d%d", &res[sz].x, &res[sz].y, &res[sz].w);
res[sz].tim = tim++;
res[sz++].type = type;
} else if(type == ) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
ans[++query] = (y2 - y1 + ) * (x2 - x1 + ) * S;
res[sz++] = {type, tim++, x1-, y1-, , query};
res[sz++] = {type, tim++, x2, y1-, -, query};
res[sz++] = {type, tim++, x1-, y2, -, query};
res[sz++] = {type, tim++, x2, y2, , query};
}
}
sort(res, res+sz, cmp_S);
CDQ(, sz-);
for(int i = ; i <= query; ++i)
printf("%d\n", ans[i]);
return ;
}

最新文章

  1. Mac版PhpStorm之XAMPP整合apache服务器配置
  2. pytho简单爬虫_模拟登陆西电流量查询_实现一键查询自己的校园网流量
  3. zabbix监控超详细搭建过程
  4. HttpApplication的处理管道19个事件。
  5. LICEcap 简洁易用的动画屏幕录制软件
  6. jQuery 插件写法
  7. OpenCV系列--摄像头控制的简单代码
  8. Inside Qt Series (全集)
  9. cmd编译运行java
  10. spring history
  11. 1. 通过DHCP服务器动态获取IP地址之后无法上网的解决方法
  12. PwniumCTF2014 - JJSN总结
  13. tensorflow一些常用函数的使用注意
  14. xtrabackup全库还原+binlog日志还原
  15. Python 常用的内置函数
  16. 关于.net程序集引用不匹配的问题
  17. 【bzoj3932】 CQOI2015—任务查询系统
  18. tensorflow实现猫狗大战(分类算法)
  19. 【第十一章】 springboot + mongodb(简单查询)
  20. python3.7 安装pyopengl,环境搭建

热门文章

  1. Win32 开发记录
  2. CS231n -Assignments 1 Q1 and Q2
  3. Community Cloud零基础学习(二)信誉等级设置 &amp; Global Search设定
  4. js加密(十一)yhz566 md5
  5. MySql的数据导入到Sql Server数据库中
  6. docker学习笔记-06:自定义DockerFile生成镜像
  7. 7. 通过JDBC源码来分析线程上下文类加载器以及SPI的使用
  8. java中将图片上传到配置好的ftp服务器上
  9. JavaWeb--概述
  10. JDK8中的HashMap源码