题目

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

输入格式

第一行两个整数,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:表示输入结束

输出格式

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

输入样例

0 4

1 2 3 3

2 1 1 3 3

1 2 2 2

2 2 2 3 4

3

输出样例

3

5

提示

保证答案不会超过int范围

题解

CDQ分治

每个询问分解成4个前缀和

然后每个询问或修改就有三维(x,y,t)

一个询问被一个修改影响当且仅当t1 > t2 且x1 >= x2 且 y1 >= y2

可以上CDQ分治

【可以顺便吧2683A了】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define lbt(x) (x & -x)
using namespace std;
const int maxn = 200005,maxm = 2000005,INF = 1000000000;
inline int RD(){
int out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
while (c >= 48 && c <= 57) {out = (out << 1) + (out << 3) + c - '0'; c = getchar();}
return out * flag;
}
LL S[maxm],N,s;
void add(int u,int v){while (u <= N) S[u] += v,u += lbt(u);}
LL sum(int u){LL ans = 0; while (u) ans += S[u],u -= lbt(u); return ans;} struct Que{LL x,y,id,v,pos,t;}Q[maxn],T[maxn];
inline bool operator <(const Que& a,const Que& b){
if (a.x == b.x && a.y == b.y) return a.t < b.t;
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
LL Qi = 0,ans[maxn];
void CDQ(int l,int r){
if (l == r) return;
int mid = l + r >> 1,l1 = l,l2 = mid + 1;
for (int i = l; i <= r; i++)
if (Q[i].t <= mid && !Q[i].id) add(Q[i].y,Q[i].v);
else if (Q[i].t > mid && Q[i].id) ans[Q[i].id] += Q[i].pos * sum(Q[i].y);
for (int i = l; i <= r; i++){
//printf("[%lld,%lld],id = %lld,t = %lld\n",Q[i].x,Q[i].y,Q[i].id,Q[i].t);
if (Q[i].t <= mid){
T[l1++] = Q[i];
if (!Q[i].id) add(Q[i].y,-Q[i].v);
}
else T[l2++] = Q[i];
}
for (int i = l; i <= r; i++) Q[i] = T[i];
CDQ(l,mid); CDQ(mid + 1,r);
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out1.txt","w",stdout);
s = RD(); N = RD();
LL opt,a,b,c,d;
while (true){
opt = RD(); if (opt == 3) break;
if (opt & 1){
a = RD(),b = RD(),c = RD();
Q[++Qi] = (Que){a,b,0,c,0,Qi};
}else {
a = RD(),b = RD(),c = RD(); d = RD();
int pos = ++ans[0];
Q[++Qi] = (Que){c,d,pos,0,1,Qi};
Q[++Qi] = (Que){c,b - 1,pos,0,-1,Qi};
Q[++Qi] = (Que){a - 1,d,pos,0,-1,Qi};
Q[++Qi] = (Que){a - 1,b - 1,pos,0,1,Qi};
ans[pos] = (c - a + 1) * (d - b + 1) * s;
}
}
sort(Q + 1,Q + 1 + Qi);
CDQ(1,Qi);
REP(i,ans[0]) printf("%lld\n",ans[i]);
return 0;
}

BZOJ1176 [Balkan2007]Mokia 【CDQ分治】的更多相关文章

  1. BZOJ1176: [Balkan2007]Mokia CDQ分治

    最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...

  2. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  3. BZOJ 1176[Balkan2007]Mokia(CDQ分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3381  Solved: 1520[Submit][S ...

  4. [BZOJ1176][Balkan2007]Mokia cdq+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 1395[Submit][S ...

  5. BZOJ 1176: [Balkan2007]Mokia [CDQ分治]

    题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...

  6. BZOJ 1176 [Balkan2007]Mokia ——CDQ分治

    [题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...

  7. bzoj1176: [Balkan2007]Mokia cdq

    链接 bzoj 思路 cdq入门题,拆成4个矩阵,然后cdq. 代码 /************************************************************** P ...

  8. bzoj1176: [Balkan2007]Mokia【cdq分治】

    把询问搞成4个,cdq分治. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a;i <= b; i++) #d ...

  9. [bzoj1176]Mokia[CDQ分治]

    啃了一天论文,发现CDQ分治的原理其实很简单,大概就是这样的一类分治:将左右区间按一定规律排序后分开处理,递归到底时直接计算答案,对于一个区间,按照第二关键字split成两个区间,先处理左区间,之后因 ...

随机推荐

  1. REST Adapter实现SAP PI中的增强XML/JSON格式转换(转载)

    SAP标准的REST adapter有着XML/JSON转换的功能,它很有用,因为一方面SAP PI/PO内部以XML格式处理数据,而另一方面,在处理REST架构风格的时候,JSON才是事实上的格式. ...

  2. java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗?

    问.java经常看见 jdk5 jdk1.5 —— jdk6 jdk1.6 这两者有什么区别吗? 答:没有区别,jdk5 和 jdk1.5 所代表的意思是一样的,只是叫法不一样 关键字: jdk5 j ...

  3. px与em的区别,权重的优先级

    px与em的区别,权重的优先级 PX特点:px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.EM特点:1. em的值并不是固定的:2. em会继承父级元素的字体大小. 权重 ...

  4. Python解压ZIP、RAR等常用压缩格式的方法

    解压大杀器 首先祭出可以应对多种压缩包格式的python库:patool.如果平时只用基本的解压.打包等操作,也不想详细了解各种压缩格式对应的python库,patool应该是个不错的选择. pato ...

  5. POJ3682 概率DP

    King Arthur's Birthday Celebration Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3575 ...

  6. 如何用管理员账户登录windows10

    1.判断自己是否是管理员 在命令行中输入  whoami   只要显示不是  administrator  都不是管理员 2.  接着在命令行中输入 net user  可以查看这台电脑有多少个用户  ...

  7. hadoop中namenode发生故障的处理方法

    Namenode 故障后,可以采用如下两种方法恢复数据: 方法一:将 SecondaryNameNode 中数据拷贝到 namenode 存储数据的目录: 方法 二: 使用 -importCheckp ...

  8. ElasticSearch学习笔记(四)-- 分布式

    1. 分布式介绍及cerebro cerebro插件 点击release下载 解压运行 访问9000端口,连接es的9200端口 2. 构建集群 新增一个节点 3. 副本与分片 再加入一个节点 4.  ...

  9. C#方法参数

    使用静态字段来模拟全局变量. 如果调用者想要得到被调用者的值: 1.返回值 2.不管是实参还是形参,都是在内存中开辟了空间的. 3.方法的功能一定要单一. GetMax(int n1,int n2) ...

  10. 斐波那契数列(Fibonacci) iOS

    斐波那契数列Fibonacci 斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2 ...