P2163 [SHOI2007]园丁的烦恼

题目描述

很久很久以前,在遥远的大陆上有一个美丽的国家。统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草。

有一天国王漫步在花园里,若有所思,他问一个园丁道: “最近我在思索一个问题,如果我们把花坛摆成六个六角形,那么……”

“那么本质上它是一个深度优先搜索,陛下”,园丁深深地向国王鞠了一躬。

“嗯……我听说有一种怪物叫九头蛇,它非常贪吃苹果树……”

“是的,显然这是一道经典的动态规划题,早在N元4002年我们就已经发现了其中的奥秘了,陛下”。

“该死的,你究竟是什么来头?”

“陛下息怒,干我们的这行经常莫名其妙地被问到和OI有关的题目,我也是为了预防万一啊!” 王者的尊严受到了伤害,这是不可容忍的。

看来一般的难题是难不倒这位园丁的,国王最后打算用车轮战来消耗他的实力: “年轻人,在我的花园里的每一棵树可以用一个整数坐标来表示,一会儿,我的骑士们会来轮番询问你某一个矩阵内有多少树,如果你不能立即答对,你就准备走人吧!”说完,国王气呼呼地先走了。

这下轮到园丁傻眼了,他没有准备过这样的问题。所幸的是,作为“全国园丁保护联盟”的会长——你,可以成为他的最后一根救命稻草。

输入格式

第一行有两个整数n,m(0≤n≤500000,1≤m≤500000)。n代表皇家花园的树木的总数,m代表骑士们询问的次数。

文件接下来的n行,每行都有两个整数xi,yi,代表第i棵树的坐标(0≤xi,yi≤10000000)。

文件的最后m行,每行都有四个整数aj,bj,cj,dj,表示第j次询问,其中所问的矩形以(aj,bj)为左下坐标,以(cj,dj)为右上坐标。

输出格式

共输出m行,每行一个整数,即回答国王以(aj,bj)和(cj,dj)为界的矩形里有多少棵树。

输入输出样例

输入 #1复制

3 1
0 0
0 1
1 0
0 0 1 1

输出 #1复制

3

思路:

三维偏序解决二维平面中矩形包括多少个点数问题。

维度:

{

​ x轴

​ y轴

​ 操作类型

}

我们把初始给定的n个点转为向坐标系中加点的操作

m个询问转为询问问题。

那么按照x,y升序排序,想x和y都相等时,加点的操作优先。

通过二维前缀和性质,把询问分解为四个(0,0)节点为左下角子询问积累贡献求得。

排序后,利用树桩数组来维护答案。

代码:

#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 = 3000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/ll tree[maxn];
int lowbit(int x)
{return -x & x;
}
ll ask(int x)
{ll res = 0ll;while (x) {res += tree[x];x -= lowbit(x);}return res;
}
int my=0;
void add(int x, ll val)
{while (x < my) {tree[x] += val;x += lowbit(x);}
}
pii a[maxn];
pii b[maxn];
pii c[maxn];
int n, m;
std::vector<int> vx,vy;
struct node {int op;int x, y;int k;int id;node() {}node(int opp, int xx, int yy, int kk, int idd){op = opp;x = xx;y = yy;k = kk;id = idd;}
} info[maxn];
int ans[maxn];
bool cmp(node aa, node bb)
{if (aa.x != bb.x) {return aa.x < bb.x;} else if (aa.op != bb.op) {return aa.op < bb.op;} else {return aa.y < bb.y;}
}
int main()
{//freopen("D:\\code\\text\\input.txt","r",stdin);//freopen("D:\\code\\text\\output.txt","w",stdout);gbtb;cin >> n >> m;repd(i, 1, n) {cin >> a[i].fi >> a[i].se;vx.push_back(a[i].fi);vy.push_back(a[i].se);}repd(i, 1, m) {cin >> b[i].fi >> b[i].se >> c[i].fi >> c[i].se;vx.push_back(b[i].fi);vy.push_back(b[i].se);vx.push_back(c[i].fi);vy.push_back(c[i].se);vy.push_back(b[i].se - 1);vx.push_back(b[i].fi - 1);}sort(ALL(vx));sort(ALL(vy));vx.erase(unique(ALL(vx)),vx.end());vy.erase(unique(ALL(vy)),vy.end());my=sz(vy)+10;int cnt = 0;int dx, dy;repd(i, 1, n) {++cnt;dx = lower_bound(ALL(vx), a[i].fi) - vx.begin() + 1;dy = lower_bound(ALL(vy), a[i].se) - vy.begin() + 1;info[cnt] = node(0, dx, dy, 0, 0);}repd(i, 1, m) {++cnt;dx = lower_bound(ALL(vx), c[i].fi) - vx.begin() + 1;dy = lower_bound(ALL(vy), c[i].se) - vy.begin() + 1;info[cnt] = node(1, dx, dy, 1, i);++cnt;dx = lower_bound(ALL(vx), c[i].fi) - vx.begin() + 1;dy = lower_bound(ALL(vy), b[i].se - 1) - vy.begin() + 1;info[cnt] = node(1, dx, dy, -1, i);++cnt;dx = lower_bound(ALL(vx), b[i].fi - 1) - vx.begin() + 1;dy = lower_bound(ALL(vy), c[i].se) - vy.begin() + 1;info[cnt] = node(1, dx, dy, -1, i);++cnt;dx = lower_bound(ALL(vx), b[i].fi-1) - vx.begin() + 1;dy = lower_bound(ALL(vy), b[i].se-1) - vy.begin() + 1;info[cnt] = node(1, dx, dy, 1, i);}sort(info + 1, info + 1 + cnt, cmp);repd(i, 1, cnt) {if (!info[i].op) {add(info[i].y, 1);} else {ans[info[i].id] += info[i].k * ask(info[i].y);}}repd(i, 1, m) {printf("%d\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/11594591.html

洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)相关推荐

  1. 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)

    题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...

  2. [洛谷]P3353 在你窗外闪耀的星星 (#树状数组)

    题目描述 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀着你玫瑰色的 ...

  3. P2163 [SHOI2007]园丁的烦恼(二维数点模板题)

    P2163 [SHOI2007]园丁的烦恼 题意: 在一个二维平面内有一些点,给你一个左上角和右下角的点,问这个范围内有多少点 题解: 二维数点模板题 我们设F(a,b)表示以(0,0)为左下角,(a ...

  4. P2163 [SHOI2007]园丁的烦恼 (CDQ 分治)

    P2163 [SHOI2007]园丁的烦恼 注意x = 0 和 y = 0; 题目背景 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各 ...

  5. 洛谷 P2163 [SHOI2007]Tree 园丁的烦恼

    此题树状数组卡常好题(滑稽) 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他 ...

  6. bzoj 3173: [Tjoi2013]最长上升子序列(离线二分+树状数组)

    3173: [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2051  Solved: 1041 [Submit] ...

  7. 数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

    文章目录 树状数组 lowbit 线段树与树状数组 单点修改 区间查询 区间修改 区间求和 二维树状数组 离线树状数组 例题 POJ:stars MooFest [SDOI2009]HH的项链 Tur ...

  8. 【HDU - 5869】Different GCD Subarray Query(思维,数学,gcd,离线处理,查询区间不同数,树状数组 或 二分RMQ)

    题干: This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Di ...

  9. 2019 南京 网络赛 B (二维偏序,树状数组离线)

    题意: 给出一N*N的蛇形矩阵,具体位置元素值不给你,自己找规律,然后给你M个 有效位置,P次查询,每次查询一个子矩阵中有效元素的权值和,该权值和等于对于 每个有效元素,模10拆分后相加得到的和.(注 ...

最新文章

  1. python知乎-知乎大佬李启方道出肺腑之言:为什么我不建议你学Python?
  2. 干货素材|UI设计师需要了解的APP弹窗模板
  3. python的诞生和发展历史_Python发展史-一门编程语言的起源
  4. android标题栏添加按钮_几行代码实现Android通用标题栏(轻松向左右两侧添加Menu)...
  5. angular使用动态组件后属性值_Angular 2-组件
  6. 初识ObjectBox--Android平台
  7. 【计算机网络】传输层 : 传输层概述 ( 设备层级 | 传输层功能 | TCP 协议 | UDP 协议 | 复用与分用 | 端口号 | 套接字 )
  8. 恶魔奶爸语法4-6课
  9. Ubuntu 搭建强大的 IDE —— Vim + Vundle + 插件
  10. 对未来技术方向的思考
  11. ps怎么抠地图线路_用PS怎么抠地图?
  12. Flutter ——图片九宫格,多图片批量上传(图片选择采用官方image_picker实现,批量上传采用dio,消息提示)
  13. 四、spring源码解读初始化
  14. Python-玩转数据-动态地图
  15. 如何更好的思考和学习
  16. flv格式视频怎么转换成mp4
  17. java 跳过 SSL
  18. 搭建whistle代理环境
  19. 解决error MSB6006: “CL.exe”已退出,代码为 -1073741515。
  20. 基于javaweb的水果生鲜商城系统(java+springboot+mybatis+vue+mysql)

热门文章

  1. How is Aggregation designed
  2. SAP Commerce Accelerator从2005升级到2011的步骤
  3. Linux系统里让vim支持markdown格式的语法高亮
  4. 另一种方式实现事务码SE16里的结果集修改
  5. 虚拟机VirtualBox中Ubuntu无法全屏(终极解决方法)
  6. 动态分区分配的“首次适应算法_kafka集群关于资源分配的手册
  7. ionic2 html 转义,ionic2 基于ngx-translate实现多语言切换,翻译
  8. python输出三角形周长_976. 三角形的最大周长(Python)
  9. mysql + IDEA + JDBC
  10. 如何使用graphpad做柱形图_系列文章 如何使用PaddleDetection做一个完整项目(三)...