BZOJ 1176: [Balkan2007]Mokia
1176: [Balkan2007]Mokia
Time Limit: 30 Sec Memory Limit: 162 MB
Submit: 2012 Solved: 896
[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
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3
Sample Output
5
HINT
保证答案不会超过int范围
Source
CDQ分治。
#include <bits/stdc++.h>
const int maxn = ;
const int maxw = ;
int tr[maxw], w;
inline void add(int t, int k) {
for (; t <= w; t += t&-t)
tr[t] += k;
}
inline int ask(int t) {
int ret = ;
for (; t; t -= t&-t)
ret += tr[t];
return ret;
}
inline int ask(int a, int b) {
return ask(b) - ask(a - );
}
struct data {
int k, a, b, c, d, t, p;
}s[maxn]; int tot = ;
int ans[maxn], cnt = ;
inline void add(void) {
scanf("%d%d%d", &s[tot].a, &s[tot].b, &s[tot].c), s[tot].t = tot, s[tot++].k = ;
}
inline void qry(void) {
int x1, x2, y1, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); --x1;
s[tot].k = , s[tot].a = x1, s[tot].b = y1, s[tot].c = y2, s[tot].d = -, s[tot].t = tot, s[tot++].p = cnt;
s[tot].k = , s[tot].a = x2, s[tot].b = y1, s[tot].c = y2, s[tot].d = +, s[tot].t = tot, s[tot++].p = cnt++;
}
inline bool cmp(const data &a, const data &b) {
if (a.a != b.a)return a.a < b.a;
else return a.k < b.k;
}
void solve(int l, int r) {
if (l >= r)return;
int mid = (l + r) >> ;
solve(l, mid); solve(mid + , r);
std::sort(s + l, s + r + , cmp);
for (int i = l; i <= r; ++i)
if (s[i].k == && s[i].t <= mid)
add(s[i].b, s[i].c);
else if (s[i].k == && s[i].t > mid)
ans[s[i].p] += ask(s[i].b, s[i].c) * s[i].d;
for (int i = l; i <= r; ++i)
if (s[i].k == && s[i].t <= mid)
add(s[i].b, -s[i].c);
}
signed main(void) {
scanf("%*d%d", &w);
int k; while (scanf("%d", &k), k != )
(k == ) ? add() : qry();
solve(, tot - );
for (int i = ; i < cnt; ++i)
printf("%d\n", ans[i]);
}
@Author: YouSiki
BZOJ 1176: [Balkan2007]Mokia的更多相关文章
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- BZOJ 1176[Balkan2007]Mokia(CDQ分治)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 3381 Solved: 1520[Submit][S ...
- BZOJ 1176 [Balkan2007]Mokia ——CDQ分治
[题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...
- BZOJ 1176: [Balkan2007]Mokia [CDQ分治]
题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...
- bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
- bzoj 1176 [Balkan2007]Mokia 【CDQ分治】
W过大,很难在线维护,考虑离线算法 给每个操作加一个时间属性n,显然,对于n=i的询问,对它有影响的修改只在n<i中,所以可以CDQ(因为是按时间序读进来的,所以不用排序了 对于统计矩形和,可以 ...
- BZOJ 1176: [Balkan2007]Mokia KDtree
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin), ...
- BZOJ 1176([Balkan2007]Mokia-CDQ分治-分治询问)
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MB Submit: 185 Solved: 94 [ Submit] ...
- 1176: [Balkan2007]Mokia
1176: [Balkan2007]Mokia 链接 分析 三维偏序问题,CDQ分治论文题. 代码 #include<bits/stdc++.h> using namespace std; ...
随机推荐
- mysql常处理用时间sql语句
Mysql日期函数,时间函数使用的总结,以及时间加减运算(转) select timediff('23:40:00', ' 18:30:00'); -- 两时间相减SELECT substring( ...
- Effective Java笔记一 创建和销毁对象
Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...
- ios native工程集成react-native的demo
react-native看到了给现有工程添加react-native环境的时候碰到一个问题: 如何往工程中添加 package.json文件,以及node_modules是怎么来的? 我开始的时候以为 ...
- swift学习笔记1——基础部分
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- 在本机搭建SVN服务器
目的:在没有正式的SVN服务器的情况下,完成代码的本地备份. 参考:http://blog.csdn.net/ladofwind/article/details/2100200 以下是具体内容: 如何 ...
- nodejs---修改文件名字
D:\node\update_name目录有如下文件: 1:文件夹:icons 2:js文件:update-name.js js文件代码: // 引入fs文件处理模块var fs = require( ...
- MySQL备份原理详解
备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(R ...
- 图像处理中任意核卷积(matlab中conv2函数)的快速实现。
卷积其实是图像处理中最基本的操作,我们常见的一些算法比如:均值模糊.高斯模糊.锐化.Sobel.拉普拉斯.prewitt边缘检测等等一些和领域相关的算法,都可以通过卷积算法实现.只不过由于这些算法的卷 ...
- S5PV210_时钟系统
1.S5PV210的时钟获得:外部晶振+内部时钟发生器+内部PLL产生高频时钟+内部分频器分频 S5PV210外部有4个W晶振接口,可以根据需要来决定在哪里接晶振.接了晶振之后上电相应的模块就能产生振 ...
- 【JS/CSS3】实现带预览图幻灯片效果~
一.前期准备 1.1 案例分析 适用场景:单例布局1.2 方法论 V视图 HTML+CSS+调试C js实现控制流程D数据 优化扩展 二.代码 结构 <div class="slide ...