链接

bzoj

思路

cdq入门题,拆成4个矩阵,然后cdq。

代码

/**************************************************************Problem: 1176User: gryz2016Language: C++Result: AcceptedTime:2652 msMemory:13012 kb
****************************************************************/#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x&-x)
const int N = 2e5 + 7;
int read() {int x = 0, f = 1; char s = getchar();for (; s > '9' || s < '0'; s = getchar()) if (s == '-') f = -1;for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';return x * f;
}
int n, a[N], ans[N];
struct ask {int opt, x, y, w, id;ask(int a = 0, int b = 0, int c = 0, int d = 0, int e = 0) {opt = a, x = b, y = c, w = d, id = e;}bool operator < (const ask &b) const {return x == b.x ? opt < b.opt : x < b.x;}
} Q[N], tmp[N];
int lsh_y[N << 1];
namespace BIT {int sum[N], maxn;void add(int id, int w) {for (int i = id; i <= maxn; i += lowbit(i)) sum[i] += w;}int query(int x) {int ans = 0;for (int i = x; i >= 1; i -= lowbit(i)) ans += sum[i];return ans;}
}
void cdq(int l, int r) {if (l == r) return;int mid = (l + r) >> 1;cdq(l, mid), cdq(mid + 1, r);int p = l, q = mid + 1, js = l;while (p <= mid && q <= r) {if (Q[p] < Q[q]) {if (Q[p].opt == 1) BIT::add(Q[p].y, Q[p].w);tmp[js++] = Q[p++];} else {if (Q[q].opt == 2) ans[Q[q].id] += Q[q].w * BIT::query(Q[q].y);tmp[js++] = Q[q++];}}if (p <= mid) {for (int i = l; i < p; ++i) if (Q[i].opt == 1) BIT::add(Q[i].y, -Q[i].w);while (p <= mid) tmp[js++] = Q[p++];} else {while (q <= r) {if (Q[q].opt == 2) ans[Q[q].id] += Q[q].w * BIT::query(Q[q].y);tmp[js++] = Q[q++];}for (int i = l; i <= mid; ++i) if (Q[i].opt == 1) BIT::add(Q[i].y, -Q[i].w);}for (int i = l; i <= r; ++i) Q[i] = tmp[i];
}
int main() {
//  freopen("a.in", "r", stdin);int S = read(), W = read(), n = 0, DSR = 0;while (233) {int opt = read();if (opt == 3) break;if (opt == 1) {int x = read(), y = read(), w = read();Q[++n] = ask(opt, x, y, w), lsh_y[++lsh_y[0]] = Q[n].y;} else {++DSR;int a = read(), b = read(), x = read(), y = read();if (x && y) Q[++n] = ask(opt, x, y, 1, DSR), lsh_y[++lsh_y[0]] = Q[n].y;if (a - 1 && b - 1) Q[++n] = ask(opt, a - 1, b - 1, 1, DSR), lsh_y[++lsh_y[0]] = Q[n].y;if (a - 1 && y) Q[++n] = ask(opt, a - 1, y, -1, DSR), lsh_y[++lsh_y[0]] = Q[n].y;if (x && b - 1) Q[++n] = ask(opt, x, b - 1, -1, DSR), lsh_y[++lsh_y[0]] = Q[n].y;}}sort(lsh_y + 1, lsh_y + 1 + lsh_y[0]);lsh_y[0] = unique(lsh_y + 1, lsh_y + 1 + lsh_y[0]) - lsh_y - 1;for (int i = 1; i <= n; ++i) Q[i].y = lower_bound(lsh_y + 1, lsh_y + 1 + lsh_y[0], Q[i].y) - lsh_y;BIT::maxn = lsh_y[0] + 1;cdq(1, n);for (int i = 1; i <= DSR; ++i) printf("%d\n", ans[i]);return 0;
}

转载于:https://www.cnblogs.com/dsrdsr/p/10992605.html

bzoj1176: [Balkan2007]Mokia cdq相关推荐

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

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

  2. BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和)

    BZOJ 1176[Balkan2007]Mokia (cdq分治,矩阵加矩阵求和) Description 维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值. ...

  3. BZOJ 1176: [Balkan2007]Mokia

    一道CDQ分治的模板题,然而我De了一上午Bug...... 按时间分成左右两半,按x坐标排序然后把y坐标丢到树状数组里,扫一遍遇到左边的就add,遇到右边的query 几个弱智出了bug的点, 一是 ...

  4. 【BOI2007】【BZOJ1176】Mokia

    1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MB Submit: 1059 Solved: 432 [Submit][St ...

  5. bzoj 1176 Mokia (cdq分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 3874  Solved: 1742 [Submit] ...

  6. cdq分治(bzoj 1176: [Balkan2007]Mokia bzoj 2683: 简单题)

    CDQ分治: 本质:对询问进行分治 优点:和莫队分块一样都属于技巧,关键时刻能免去复杂的数据结构,常数小 缺点:必须离线 参考:http://blog.csdn.net/hbhcy98/article ...

  7. [bzoj] 1176 Mokia || CDQ分治

    原题 给出W×W的矩阵(S没有用,题目有误),给出无限次操作,每次操作的含义为: 输入1:你需要把(x,y)(第x行第y列)的格子权值增加a 输入2:你需要求出以左下角为(x1,y1),右上角为(x2 ...

  8. BZOJ4066: 简单题

    BZOJ4066: 简单题 Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y& ...

  9. bzoj1176【Balkan2007】Mokia

    1176: [Balkan2007]Mokia Time Limit: 30 Sec   Memory Limit: 162 MB Submit: 1683   Solved: 732 [ Submi ...

最新文章

  1. 微型计算机地未来发展,微型计算机的发展历史、现状和未来(最新) PDF.doc
  2. UVA dp题目汇总
  3. Qt工作笔记-QDialog模式对话框传递数据给主窗口
  4. JavaScript数组方法速查手册
  5. 想在研发群里装?先学会这几个排查K8s问题的办法
  6. Exchange 2010 OWA更改过期密码
  7. 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(4)签到题4题
  8. Docker系列(九)Docker的远程访问
  9. hdu 2553(N皇后)
  10. Luogu3825[NOI2017] 游戏
  11. 电脑如何快速截屏技巧 四种常见的电脑截图方法
  12. 2018iscc 河南线下 赛题 逆向部分题解
  13. ASP类计算机专业毕业设计题目
  14. PS软件Photoshop设置使用鼠标进行放大缩小设置
  15. 报表工具对比选型系列用例——排名及跨行组统计
  16. 大数据杀熟?我从银行数仓项目学到了什么
  17. elasticsearch 学习之 搭建简单的elasticsearch多节点服务器
  18. 如何在百度和各大网站搜索到自己的文章
  19. WordPress教程 WordPress自动文章添加特色图片教程
  20. python好学吗要有什么基础-Python0基础好学吗?

热门文章

  1. 如何用计算机计算胸围,文胸尺码计算器
  2. 计算机学业水平考试答题卡,高一年级期末信息技术考试(含答题卡)
  3. Linux——less指令常用操作
  4. php 用户授权访问控制,用户权限访问控制功能
  5. mysql显示表已存在_MySQL数据库与数据表的相关操作
  6. android动画view上移,在Android开发中使用View制作一个引导动画
  7. linux用户开放crontab权限,linux – / etc / crontab权限
  8. html支持的脚本语言,能不能让日志内容在支持html语言的同时支持一下脚本语言,拜托!拜托!...
  9. MySQL 内连接查询
  10. Spring Boot EasyPoi导出Excel下载