http://www.lydsy.com/JudgeOnline/problem.php?id=1176

分治的例题

把每个询问拆成四个询问,整体二分里x坐标递增,按x坐标扫的时候用树状数组维护y坐标前缀和。

一开始想复杂了,按cdq分治先solve左边再处理中间再solve右边,这样每次都要对x坐标排序,常数巨大,T了好几次TwT

后来参考了别人的代码,发现自己一开始就想复杂了。这道题不需要在solve完后还是保持原来的按x坐标递增的顺序,也不需要先处理出左边的信息才能更新右边的信息。

这样直接分治啊~~~~~处理完一大块左边对右边的贡献再递归处理左右两块。只要一开始对x坐标排序即可,solve的过程从整到散,不需要再进行排序。

一开始还忘了离散化,每次清空树状数组都用memsetヽ(*´Д`*)ノ后来发现从前往后扫一遍把原先加的减回去会快得多。

时间复杂度$O(mlogmlogw)$,m的含义为所有修改和询问的数量,w的含义为离散化y坐标后的y坐标最大值,即树状数组的上界。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&(-x))
using namespace std;
int in() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 3) + (k << 1) + c - '0';
return k * fh;
} struct node {
int op, x, y, a, id, pos;
bool operator < (const node &A) const {
return x == A.x ? (y == A.y ? pos < A.pos : y < A.y) : x < A.x;
}
} Q[200003], q[200003]; int s, w, m = 0, ans[40003]; namespace CDQ {
int bits[180003];
void update(int x, int num) {
for(; x <= w; x += lowbit(x)) bits[x] += num;
}
int Qsum(int x) {
int ret = 0;
for(; x; x -= lowbit(x)) ret += bits[x];
return ret;
} void solve(int l, int r) {
if (l == r) return;
int mid = (l + r) >> 1;
for(int i = l; i <= r; ++i) {
if (Q[i].op == 1 && Q[i].id <= mid) update(Q[i].y, Q[i].a);
if (Q[i].op == 2 && Q[i].id > mid) ans[Q[i].pos] += Q[i].a * Qsum(Q[i].y);
} for(int i = l; i <= r; ++i)
if (Q[i].op == 1 && Q[i].id <= mid) update(Q[i].y, -Q[i].a); int tl = l, tr = mid + 1;
for(int i = l; i <= r; ++i)
if (Q[i].id <= mid) q[tl++] = Q[i];
else q[tr++] = Q[i];
for(int i = l; i <= r; ++i) Q[i] = q[i]; solve(l, mid);
solve(mid + 1, r);
}
} int H[180003], cnt = 0, anscnt = 0;
int main() {
s = in(); w = in(); int x1, y1, x2, y2;
for(int x = in(); x != 3; x = in())
if (x == 1) {
Q[++m].op = 1;
Q[m].x = in(); Q[m].y = in(); Q[m].a = in(); Q[m].id = m; Q[m].pos = 0;
H[++cnt] = Q[m].y;
} else {
x1 = in(); y1 = in(); x2 = in(); y2 = in();
H[++cnt] = y1 - 1; H[++cnt] = y2;
ans[++anscnt] = s * (x2 - x1 + 1) * (y2 - y1 + 1);
++m; Q[m] = (node) {2, x1 - 1, y1 - 1, 1, m, anscnt};
++m; Q[m] = (node) {2, x1 - 1, y2, -1, m, anscnt};
++m; Q[m] = (node) {2, x2, y1 - 1, -1, m, anscnt};
++m; Q[m] = (node) {2, x2, y2, 1, m, anscnt};
} sort(H + 1, H + cnt + 1);
cnt = unique(H + 1, H + cnt + 1) - H;
w = cnt - 1; for(int i = 1; i <= m; ++i) Q[i].y = lower_bound(H + 1, H + cnt, Q[i].y) - H; sort(Q + 1, Q + m + 1); CDQ::solve(1, m); for(int i = 1; i <= anscnt; ++i) printf("%d\n", ans[i]); return 0;
}

一定要想好了再码!

【BZOJ 1176】【Balkan 2007】Mokia的更多相关文章

  1. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  2. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  3. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  4. 【BZOJ】【2084】【POI2010】Antisymmetry

    Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...

  5. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  6. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  7. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  8. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

  9. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

随机推荐

  1. Qt基础之开发环境部署

    将 Qt 5.6 集成至 VS2015 摘要: 由于VS2015不再支持addin,所以要用其他手段. 这里给出64位系统下的安装步骤,32位类似. 一.安装VS2015 过程略.值得注意的是要选择需 ...

  2. 拓扑排序 POJ2367Genealogical tree[topo-sort]

    ---恢复内容开始--- Genealogical tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4875   A ...

  3. unity3d 的Quaternion.identity和transform.rotation区别是什么

    Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可 ...

  4. NODE.JS开发指南学习笔记2

    1.核心模块 核心模块是Node.js的心脏,由一些精简高效的库组成,为其提供了基本的API.2.全局对象 global.所有的的全局变量都是其属性.其根本的作用是作为全局变量的宿主.3.全局变量 1 ...

  5. JavaScript语言精粹笔记

    JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取 ...

  6. java问题小总结

    1.在使用equals的时候,把  "".equals(name);放在左边 如果右边的没有初始化,可以避免出错. 2.对于 ObjectId id; 在mongodb里面对其进行 ...

  7. C语言:关于socket的基础知识点

    /** * ---结构体--- * * #include <sys/socket.h> * struct sockaddr { * unsigned short sa_family; * ...

  8. xhprof使用笔记(非原创)

    [作用] xhprof是facebook开源的一个php性能分析工具. [安装] xhprof扩展的安装: wget   http://pecl.php.net/get/xhprof-0.9.2.tg ...

  9. Java多线程总结(二)锁、线程池

    掌握Java中的多线程,必须掌握Java中的各种锁,以及了解Java中线程池的运用.关于Java多线程基础总结可以参考我的这篇博文Java多线程总结(一)多线程基础 转载请注明出处——http://w ...

  10. flask+sqlite3+echarts2+ajax数据可视化--静态图

    结构: /www | |-- /static | | | |-- echarts.js(当然还有echarts原dist目录下的文件(夹)) | |-- /templates | | | |-- in ...