P2163 [SHOI2007]园丁的烦恼

题意:

在一个二维平面内有一些点,给你一个左上角和右下角的点,问这个范围内有多少点

题解:

二维数点模板题
我们设F(a,b)表示以(0,0)为左下角,(a,b)为右上角的矩阵内有多少点
如图不难得到:
黑色部分为=F(c,d)+F(a-1,b-1)-F(a-1,d)-F(c,b-1)
(不就是二维前缀和)

因为数据范围过大,所以横纵坐标都离散化处理。
现在我们如何求(0,0)到(x,y)内点的数量
我们把矩阵内的点看作是插入操作,相当于在矩阵中(x,y)位置+1.
把所有插入操作和查询操作以x坐标为第一关键字,y坐标为第二关键字排序
若第i个是查询操作,仅有[1,i-1]中的插入操作能影响它,因为第i个操作后面的操作坐标都比它大
同样第i个操作是插入操作,不会影响到前面的查询
这样就利用树状数组实现二维数点问题
CDQ也可以二维数点,也是模板题

主席树也可以二维数点,这里有详细讲解

代码:

树状数组代码:

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<math.h>
#include<vector>
#define re register int
#define rl register ll
#define lowbit(x) x&(-x)
using namespace std;
typedef long long ll;
int read() {re x=0,f=1;char ch=getchar();while(ch<'0' || ch>'9') {if(ch=='-')  f=-1;ch=getchar();}while(ch>='0' && ch<='9') {x=10*x+ch-'0';ch=getchar();}return x*f;
}
inline void write(int x) {if(x>9)    write(x/10);putchar(x%10+'0');
}
inline char GetChar() {char ch=getchar();while(ch!='A' && ch!='B' && ch!='C') ch=getchar();return ch;
}const int Size=500005;
int n,m,tot,maxn,ny[Size*5];
struct zyd {int id,x,y,k,dt;
} Q[Size*5];
inline void Push(int x,int y,int k,int id) {Q[++tot].x=x;Q[tot].y=y;Q[tot].k=k;Q[tot].id=id;Q[tot].dt=tot;
}
inline bool comp(zyd jzm,zyd xjp) {if(jzm.x!=xjp.x)    return jzm.x<xjp.x;if(jzm.y!=xjp.y) return jzm.y<xjp.y;return jzm.dt<xjp.dt;
}
int tree[Size];
inline void update(int x) {for(re i=x; i<=maxn; i+=lowbit(i)) {tree[i]++;}
}
inline int query(int x) {int ans=0;for(re i=x; i; i-=lowbit(i)) {ans+=tree[i];}return ans;
}
int out[Size];
void solve() {n=read();m=read();for(re i=1; i<=n; i++) {int x=read();int y=read();Push(x,y,0,0);}for(re i=1; i<=m; i++) {int a=read();int b=read();int c=read();int d=read();Push(c,d,1,i);Push(a-1,b-1,1,i);Push(a-1,d,-1,i);Push(c,b-1,-1,i);}sort(Q+1,Q+1+tot,comp);for(re i=1; i<=tot; i++) {ny[i]=Q[i].y;}sort(ny+1,ny+1+tot);maxn=unique(ny+1,ny+1+tot)-(ny+1);for(re i=1; i<=tot; i++) {Q[i].y=lower_bound(ny+1,ny+1+maxn,Q[i].y)-ny;}for(re i=1; i<=tot; i++) {if(!Q[i].k) {update(Q[i].y);} else if(Q[i].k==1) {out[Q[i].id]+=query(Q[i].y);} else {out[Q[i].id]-=query(Q[i].y);}}for(re i=1; i<=m; i++) {printf("%d\n",out[i]);}
}int main() {solve();return 0;
}

CDQ代码:

#include<bits/stdc++.h>
#define maxn 5000005 * 5
using namespace std;
inline int read()
{char x = getchar();int lin = 0, f = 1;while(x < '0' || x > '9'){if(x == '-') f = -1;x = getchar();}while(x >= '0' && x <= '9'){lin = lin * 10 + x - '0';x = getchar();}return lin * f;
}
struct st{int x,y,typ,add,id,ans;
}s[maxn],ce[maxn];
int n,m,x,y,tot,a,b,c,d,ans[maxn];
void add(int x,int y,int typ,int add,int id,int ans)
{s[++tot] = (st) {x,y,typ,add,id,ans};
}
bool com(st a,st b)
{if(a.x == b.x)if(a.y == b.y)return a.typ < b.typ;else return a.y < b.y;return a.x < b.x;
}
void cdq(int l,int r)
{if(l == r) return;int mid = l + r >> 1;cdq(l,mid);cdq(mid + 1,r);int le = l,re = mid + 1,pos = 0,ans = 0;while(le <= mid || re <= r){if(re > r || (le <= mid && s[le].y <= s[re].y)){if(s[le].typ == 1) ++ans;ce[++pos] = s[le++];}else{if(s[re].typ == 2) s[re].ans += ans;ce[++pos] = s[re++];}}for(int i = 1; i <= pos; i++)s[l + i - 1] = ce[i];
}int main(){n = read(); m = read();for(int i = 1; i <= n; i++){x = read(); y = read();add(x,y,1,0,0,0);}for(int i = 1; i <= m; i++){a = read(); b = read();c = read(); d = read();add(a - 1,b - 1,2,1,i,0);add(c,d,2,1,i,0);add(a - 1,d,2,-1,i,0);add(c,b - 1,2,-1,i,0);}sort(s + 1,s + 1 + tot,com);cdq(1,tot);for(int i = 1; i <= tot; i++)if(s[i].typ == 2)ans[s[i].id] += s[i].add * s[i].ans;for(int i = 1; i <= m; i++)printf("%d\n",ans[i]);
}

P2163 [SHOI2007]园丁的烦恼(二维数点模板题)相关推荐

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

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

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

    P2163 [SHOI2007]园丁的烦恼 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园 ...

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

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

  4. bzoj1935 [Shoi2007]Tree 园丁的烦恼 二维偏序

    其实这个题就是一个二维偏序,注意不要往树套树上想了 用容斥求出4个点的偏虚前缀和 保证y<要求点 ,就按y排序,分别处理每个询问点 保证x>要求点,就树状数组求前缀和 码: #includ ...

  5. 【数据结构】二维数点/二维偏序

    该内容需要有一定的数据结构基础,前置知识:二维前缀和.树状数组.线段树.扫描线等 二维数点的解法较多,可自行查找和学习其他解法 二维数点简介 二维数点又称二维偏序,它是这样一类问题,给出一个二维平面內 ...

  6. 点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)

    题目链接 题目大意: 给出一棵树,问有多少条路径权值和不大于www,长度不大于lll 解题思路: 首先树上路径问题大概率就是点分治了 但是我们对于每个路径有两个性质就是(li,wi)(l_i,w_i) ...

  7. [SHOI2007]园丁的烦恼

    裸的二维数点 #include"cstdio" #include"cstring" #include"iostream" #include& ...

  8. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  9. P3899 [湖南集训]谈笑风生 主席树解决二维数点

    传送门 文章目录 题意: 思路: 题意: 思路: 由于a,ba,ba,b都比ccc厉害,那么a,ba,ba,b一定是某个是某个的祖先.那么就分为两种情况了: (1)(1)(1) bbb在aaa上面,约 ...

最新文章

  1. flask部署pytorch
  2. [工具]-脚本自动化工具:按照linux kernel标准格式化输出文件(format_file)
  3. cvc降噪和主动降噪_降噪蓝牙耳机哪款好?300内建议入手的五款主动降噪蓝牙耳机...
  4. BigDecimal加减乘除运算
  5. mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
  6. Swift调用Objective C的FrameWork
  7. “入圈”高端大获成功!小米10至尊版上市首月霸榜京东、天猫5000元以上档销量第一...
  8. python图像增强_使用Python进行图像增强
  9. Redis-01-NoSQL简介及Redis数据库安装
  10. java 调用 cplex
  11. 超全SQL注入实用语句
  12. SPSS 市场细分:客户画像\客户价值模型
  13. 早上集合竞价抓涨停板,集合竞价抓涨停板公式
  14. hdu 5442 (后缀数组)
  15. 统一修改PCB板上器件标识、阻值,后期方便手工焊接样板。(现以AD10为例)
  16. STM32CUBEMX 配置12脚3641BS以及串口显示RTC时间
  17. 笔试题-2023-思远半导体-数字IC设计【纯净题目版】
  18. 如何解决用户出差,脱域的问题
  19. 常见的SQL面试题(学生表_课程表_成绩表_教师表)
  20. 如何使用Chrome浏览器,打包生成自己的插件(crx格式文件)?

热门文章

  1. 22张令人叹为观止的照片,你所未知的另一面
  2. 现在的男生真的太惨了
  3. 美国劳工部揭露中国女人大数据,看完彻底傻眼了……
  4. dnf公共频道服务器不稳定已从初始化状态,DNF公共频道跨区列表 组队连不上必看...
  5. linux 编写脚本示范,Linux-scripts-简单脚本和脚本的执行
  6. handler原子锁_Linux的原子操作与同步机制
  7. python创建一个空的dataframe_python 创建一个空dataframe 然后添加行数据的实例
  8. win7美化_Potplayer64位美化版,无棒子的tv推送
  9. powercfg -h off_驭鲛记的主演会是谁?肖战关系特别好的艺人朋友呢?白敬亭和吴映洁有没有故事啊?高伟光是不是隐婚生子了?讲讲管h和马司令呗?...
  10. git maven 一键部署_Jenkins Git Maven搭建自动化部署项目环境 邮件通知