题目描述

摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统。和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米。但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题。

在定位系统中,世界被认为是一个W×W的正方形区域,由1×1的方格组成。每个方格都有一个坐标(x,y),1<=x,y<=W。坐标的编号从1开始。对于一个4×4的正方形,就有1<=x<=4,1<=y<=4(如图):

请帮助Mokia公司编写一个程序来计算在某个矩形区域内有多少名用户。

输入格式

有三种命令,意义如下:

命令 参数 意义

  • 0 W 初始化一个全零矩阵。本命令仅开始时出现一次。
  • 1 x y A 向方格(x,y)中添加A个用户。A是正整数。
  • 2 X1 Y1 X2 Y2 查询X1<=x<=X2,Y1<=y<=Y2所规定的矩形中的用户数量
  • 3 无参数 结束程序。本命令仅结束时出现一次。

输出格式

对所有命令2,输出一个一行整数,即当前询问矩形内的用户数量。

输入输出样例

输入 #1复制

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

输出 #1复制

3
5

说明/提示

对于所有数据:

1<=W<=2000000
1<=X1<=X2<=W
1<=Y1<=Y2<=W
1<=x,y<=W
0<A<=10000
命令1不超过160000个。
命令2不超过10000个。

思路:

经典的CDQ解决带修改的三维偏序问题。

第一维time,默认有序。

第二维x坐标,用归并排序结局。

第三维y坐标,用树状数组维护动态前缀和。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
#define du3(a,b,c) scanf("%d %d %d",&(a),&(b),&(c))
#define du2(a,b) scanf("%d %d",&(a),&(b))
#define du1(a) scanf("%d",&(a));
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {a %= MOD; if (a == 0ll) {return 0ll;} ll ans = 1; while (b) {if (b & 1) {ans = ans * a % MOD;} a = a * a % MOD; b >>= 1;} return ans;}
void Pv(const vector<int> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%d", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}}
void Pvl(const vector<ll> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%lld", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}}inline void getInt(int *p);
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int op;
int n;
const int maxL = 3000010;
ll tree[maxL];
int lowbit(int x)
{return -x & x;
}
ll ask(int x)
{ll res = 0ll;while (x) {res += tree[x];x -= lowbit(x);}return res;
}
void add(int x, ll val)
{while (x < maxL) {tree[x] += val;x += lowbit(x);}
}struct node {int t;int op;int x, y;int k;int val;node() {}node(int tt, int oo, int xx, int yy, int kk, int vv){t = tt;op = oo;x = xx;y = yy;k = kk;val = vv;}bool operator<= (const node &bb )const{if (x != bb.x) {return x < bb.x;} else {return y <= bb.y;}}
};
node a[maxn];
node b[maxn];
ll ans[maxn];
int tot;
int anstot;void cdq(int l, int r)
{if (l == r) {return ;}int mid = (l + r) >> 1;cdq(l, mid);cdq(mid + 1, r);int ql = l;int qr = mid + 1;repd(i, l, r) {if (qr > r || (ql <= mid && a[ql] <= a[qr])) {if (a[ql].op == 1) {add(a[ql].y, a[ql].val);}b[i] = a[ql++];} else {if (a[qr].op == 2) {ans[a[qr].val] += a[qr].k * ask(a[qr].y);}b[i] = a[qr++];}}ql = l;qr = mid + 1;repd(i, l, r) {if (qr > r || (ql <= mid && a[ql] <= a[qr])) {if (a[ql].op == 1) {add(a[ql].y, -a[ql].val);}ql++;} else {qr++;}}repd(i, l, r) {a[i] = b[i];}
}
int main()
{//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);while (~scanf("%d", &op)) {if (op == 0) {scanf("%d", &n);} else if (op == 1) {int x, y, c;du3(x, y, c);x++;y++;tot++;a[tot] = node(tot, 1, x, y, 0, c);} else if (op == 2) {int x1, y1, x2, y2;du2(x1, y1); du2(x2, y2);x1++;y1++;x2++;y2++;tot++;a[tot] = node(tot, 2, x1 - 1, y1 - 1, 1, ++anstot);tot++;a[tot] = node(tot, 2, x1 - 1, y2, -1, anstot);tot++;a[tot] = node(tot, 2, x2, y1 - 1, -1, anstot);tot++;a[tot] = node(tot, 2, x2, y2, 1, anstot);} else {break;}}cdq(1, tot);repd(i, 1, anstot) {printf("%lld\n", ans[i]);}return 0;
}inline void getInt(int *p)
{char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}} else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}}
}

转载于:https://www.cnblogs.com/qieqiemin/p/11613573.html

P4390 [BOI2007]Mokia 摩基亚 (CDQ解决三维偏序问题)相关推荐

  1. 洛谷 - P4390 [BOI2007]Mokia 摩基亚(带修二维数点-四叉线段树/CDQ分治)

    题目链接:点击查看 题目大意:给出一个二维平面坐标系,需要执行数次操作,具体操作分为下列两种: 1 x y a:坐标 (x,y)(x,y)(x,y) 加上 aaa 个点 2 x1 y1 x2 y2:查 ...

  2. 洛谷 P4390 [BOI2007]Mokia 摩基亚 解题报告

    P4390 [BOI2007]Mokia 摩基亚 题目描述 摩尔瓦多的移动电话公司摩基亚(\(Mokia\))设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如"用户 ...

  3. 洛谷P4390 [BOI2007]Mokia 摩基亚 题解

    洛谷P4390 [BOI2007]Mokia 摩基亚 题解 题目链接:P4390 [BOI2007]Mokia 摩基亚 题意:摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和 ...

  4. luogu P4390 [BOI2007]Mokia 摩基亚

    传送门 昨天做完三维偏序并不能理解CDQ 今天做了这个题才行 (觉得没理解三维偏序是因为二维偏序没按正常方式理解) CDQ分治应用于数据结构 适用于离线的题 原理是后面的询问只能被前面的修改影响 可以 ...

  5. BOI2007 Mokia 摩基亚

    题目描述 题解: 容斥,将询问变成4个加权询问. 然后就是cdq了. 代码: #include<cstdio> #include<cstring> #include<al ...

  6. P3157 [CQOI2011]动态逆序对 (CDQ解决三维偏序问题)

    P3157 [CQOI2011]动态逆序对 题目描述 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任 ...

  7. 【BOI2007】Mokia 摩基亚

    传送门 CDQ分治板子题 其实和陌上花开差不多 把时间. l . r l.r l.r看成三个维度 像二维树状数组统计一样,把每一个询问拆成四块前缀和相减 然后统计答案的时候容斥一下 那么现在需要考虑的 ...

  8. COJS 1752. [BOI2007]摩基亚Mokia

    1752. [BOI2007]摩基亚Mokia ★★★   输入文件:mokia.in   输出文件:mokia.out   简单对比 时间限制:5 s   内存限制:128 MB [题目描述] 摩尔 ...

  9. 【原创】从BZOJ2683 简单题中 整 CDQ分治解决三维偏序

    CDQ分治 题目描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 将格子 ...

最新文章

  1. 图集内子图压缩及 ETC2 fallback选项的作用
  2. sudo rosdep init ERROR: cannot download default sources list from: https://raw.githubusercontent.com
  3. HTML标题h,HTML H标题标签
  4. asp.net web开发框架_用Python开发一个Web框架
  5. java 16进制_JAVA十六进制数据接收与传输
  6. CSDN怎样编辑公式
  7. 微信小程序api接口调用用封装
  8. 决策树(十三)--XGBoost参数调优完全指南
  9. docker MySQL-错误:2059-Authentication plugin ‘caching_sha2_password‘ cannot be loaded
  10. 关于plsqldeveloper打开报错解决方法MSVCR71.dll is missing from your compute
  11. 【springmvc】SpringMVC启动流程及源码分析
  12. Emerging Properties in Self-Supervised Vision Transformers(2021)
  13. swiper滑动时每页都有动画
  14. Ubuntu/Debain下安装微信、QQ等Windows应用(最简便方法)
  15. 一键修改手机DNS的bat文件
  16. 为云原生而生 DeepFlow破解混合云时代网络监控难题
  17. 使用DashPathEffect绘制一条动画曲线
  18. 广西省崇左市谷歌卫星地图下载
  19. list和tuple的区别:
  20. Android屏幕导出联系人,安卓手机通讯录导出到电脑(三种方法帮你导通讯录)...

热门文章

  1. 如何通过简单的配置,实现SAP Spartacus的guest checkout需求
  2. 为什么S/4HANA的销售订单创建会触发生产订单的创建 1
  3. SAP云平台,Netweaver,Kubernetes和C4C的用户和角色关系
  4. 的it生活_在日本生活了10年的IT女,聊聊回国工作的亲身经历
  5. 一次完整的性能测试过程
  6. mysql数据库的事物日志在哪里_mysql数据库中事务日志的作用
  7. 恒生电子实施怎么样_蓝思科技今年来涨幅超166%,消费电子主题基金如何挑选?...
  8. 职高计算机自我鉴定800字,中专生自我鉴定800字与中专生计算机专业自我鉴定汇编...
  9. 计算机组成原理第二版复习大纲,计算机组成原理复习大纲
  10. Python 将字符串转换成单个字符;将单个字符合并成字符串