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. NOIP2011多项式系数[快速幂|组合数|逆元]

    题目描述 给定一个多项式(by+ax)^k,请求出多项式展开后x^n*y^m 项的系数. 输入输出格式 输入格式: 输入文件名为factor.in. 共一行,包含5 个整数,分别为 a ,b ,k , ...

  2. 在JAVA中,关于反射机制的讨论

    一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...

  3. sturct2类型转化

    第三种struts2类型转换方式实例 1.convert.jsp <%@ page language="java" import="java.util.*" ...

  4. Eclipse自动打开实现类原型的工具

    http://eclipse-tools.sourceforge.net/implementors/ I always use this implementors plugin to find all ...

  5. ipone5 无法安装ipa软件

    iphone5s软件无法安装解决方法一,点击设置 - 通用 - 访问限制,先关闭“安装应用程序”选项,再打开,把后台应用程序刷新也关了,测试. iphone5s软件无法安装解决方法二,点击设置 - 通 ...

  6. FiveChess笔记

    //为0,表示该位置没有棋子:1表示该位置下过黑子:2白子 int[][] allChess = new int[19][19];//同时还通过下标记录了棋子的相对位置 1.对话框: 确认对话框(0是 ...

  7. ubuntu下crontab编辑方法的设定

    在ubuntu下,首次编辑crontab计划任务的时候,会提示让选择编辑器.由于对nano编辑器不是很熟悉,若是选择nova编辑的话,会有些麻烦.可以重置编辑器,方法如下:[root@wang ~]# ...

  8. DEDECMS之五 单页

    在网站开发中经常碰到关于我们.联系方式等简单的页面,那么在DEDECMS中如何实现? 一.效果 以上左侧导航的链接都是单页,右边为内容部分 二.单页的实现 创建频道封来实现 1.常规选项 2.高级选项 ...

  9. MVC 图片预览

    1.页面cshtml <form name="frmInput" id="frmInput" method="post" action ...

  10. md5的C++实现

    一.原理 前一阵子,想知道md5的原理查了一下资料,说得基本都一样,最后让我看懂的是这两个链接: http://blog.csdn.net/qf_study/article/details/26309 ...