1176: [Balkan2007]Mokia

Time Limit: 30 Sec  Memory Limit: 162 MB
Submit: 3134  Solved: 1395
[Submit][Status][Discuss]

Description

维护一个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 Input

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output

3
5

HINT

保证答案不会超过int范围

Source

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define maxq 800000
#define ll long long
using namespace std;
struct data {ll id,x,y,tp,f,a,p;}t[maxq],tmp[maxq];
ll s,w;
ll ans[maxq];
int cnt;
bool cmp1(data t1,data t2) {return t1.x==t2.x?t1.id<t2.id:t1.x<t2.x;}
int ask;
ll sum[];
int lowbit(int x) {return x&(-x);}
bool vis[maxq];
void insert(int x,ll ad) {for(int i=x;i<=w;i+=lowbit(i)) sum[i]+=ad;}
ll query(int x) {
ll re=;
for(int i=x;i;i-=lowbit(i)) re+=sum[i];
return re;
}
void cdq(int l,int r) {
if(l==r) return;
int mid=l+r>>;
int lp=l,rp=mid+;
for(int i=l;i<=r;i++) {
if(t[i].tp==) {
if(t[i].id>mid){ans[t[i].p]+=t[i].f*query(t[i].y);vis[t[i].p]=;}
}
else {if(t[i].id<=mid) insert(t[i].y,t[i].a);}
}
for(int i=l;i<=r;i++) if(t[i].tp==&&t[i].id<=mid) insert(t[i].y,-t[i].a);
for(int i=l;i<=r;i++) {
if(t[i].id<=mid) tmp[lp++]=t[i];
else tmp[rp++]=t[i];
}
for(int i=l;i<=r;i++) t[i]=tmp[i];
cdq(l,mid);cdq(mid+,r);
}
void add(ll x1,ll y1,ll id,ll tp,ll f) {t[cnt].p=id;t[cnt].f=f;t[cnt].tp=tp;t[cnt].x=x1;t[cnt].y=y1;t[cnt].id=cnt;}
int main() {
scanf("%lld%lld",&s,&w);
int tp;
while(scanf("%d",&tp)) {
ask++;
if(tp==) break;
if(tp==) {cnt++;scanf("%lld%lld%lld",&t[cnt].x,&t[cnt].y,&t[cnt].a);t[cnt].id=cnt;t[cnt].tp=;}
else {
ll x1,y1,x2,y2;
scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
cnt++;add(x1-,y1-,ask,,);cnt++;add(x2,y2,ask,,);
cnt++;add(x1-,y2,ask,,-);cnt++;add(x2,y1-,ask,,-);
ans[ask]+=(y2-y1+)*(x2-x1+)*s;
}
}
sort(t+,t+cnt+,cmp1);
cdq(,cnt);
for(int i=;i<=ask;i++) if(vis[i]) printf("%lld\n",ans[i]);
}

最新文章

  1. 单独使用Mybatis的配置文件
  2. [c#基础]关于const和readonly常见的笔试题剖析
  3. SQL高级查询:嵌套和分页
  4. Node.js与Express4安装与配置
  5. python 异常处理学习笔记
  6. ios本地化多语言支持
  7. 5.PHP内核探索:多进程/线程的SAPI生命周期
  8. 数据库索引&lt;二&gt; 补充前篇
  9. PhpStorm, XDebug, and DBGp Proxy
  10. 基于asp.net MVC 的服务器和客户端的交互(二)之获取Oauth 2.0认证权限
  11. js在新页面中返回到上一页浏览的历史位置
  12. Spring Boot实战笔记(二)-- Spring常用配置(Scope、Spring EL和资源调用)
  13. 2019秋招Java面经(未完待续)
  14. hiho 1098 最小生成树二&#183;Kruscal算法 (最小生成树)
  15. 2019/3/7 Java学习之多线程(基础)
  16. 第9条:try-with-resources优于try-finally
  17. Linux集群之keepalive+Nginx
  18. win10操作系统vs2010编译osg3.4.0问题解决记录
  19. Linux服务器操作指南
  20. 微信支付 h5

热门文章

  1. 使用emit发出信号
  2. Currying &amp; 柯里化
  3. 数据结构—栈(Stack)
  4. [UVA1625]Color Length
  5. [CQOI2012]局部极小值
  6. [Leetcode] search a 2d matrix 搜索二维矩阵
  7. Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) B
  8. 利用WebStorm来管理你的Github
  9. APP兼容性测试
  10. 在Maven中怎么配置外部Jar