题目

P2163 [SHOI2007]园丁的烦恼

做法

关于拆点,要真想拆直接全部用树状数组水过不就好了

做这题我们练一下\(cdq\)分治

左下角\((x1,y1)\)右上角\((x2,y2)\),查询\(x1≤x≤x2\)&&\(y1≤y≤y2\)的个数

假设点(x,y)为矩形\((x,y)(x,y)\)

其实我们要查询的是\(x1≤x,x2≥x,y1≤y≤y2\)

初始化排序\(x\)降序排,去掉\(x1≤x\),树状数组限制\(x≤x2\),区间查询\(y1≤y≤y2\),就是一三维偏序

讲一下排序吧:

由于我们要查询\(x1≤x\),所以初始化排序\(x\)降序排,\(x1\)我们就不管了

升序排\(x2\)然后进树状数组,\(y2\)其实没用(区间查询就卡过去了)

\(y1≤y\)由于这部分不好直接处理每个点结构体\(y1=y\)然后升序排

最后由于重复点也要计算我们另点的\(y2\),由于查询的\(y2\)有值,\(y2\)升序排,让查询在前

My complete code

常数贼大的代码,还没某dalao不离散跑得快

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
typedef int LL;
const LL maxn=2e6;
inline LL Read(){
LL x(0),f(1);char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
struct node{
LL x1,y1,x2,y2,id,val;
}a[maxn];
LL n,m,tot1,tot2;
LL tree[maxn],ans[maxn],x[maxn],y[maxn];
inline bool cmp2(node g1,node g2){
return g1.x2==g2.x2?(g1.y1==g2.y1?g1.y2<g2.y2:g1.y1>g2.y1):g1.x2<g2.x2;
}
inline bool cmp1(node g1,node g2){
return (g1.x1^g2.x1)?g1.x1>g2.x1:cmp2(g1,g2);
}
inline LL Lowbit(LL x){
return x&(-x);
}
inline void Add(LL x,LL val){
for(;x<=tot2;x+=Lowbit(x))
tree[x]+=val;
}
inline LL Query(LL x){
LL ret(0);
for(;x;x-=Lowbit(x))
ret+=tree[x];
return ret;
}
void Cdq(LL l,LL r){
if(l==r)
return;
LL mid(l+r>>1);
Cdq(l,mid),Cdq(mid+1,r),
sort(a+l,a+1+mid,cmp2),sort(a+mid+1,a+1+r,cmp2);
LL j(l-1);
for(LL i=mid+1;i<=r;++i){
while(j<mid&&a[j+1].x2<=a[i].x2)
Add(a[j+1].y1,a[j+1].val),++j;
ans[a[i].id]+=Query(a[i].y2)-Query(a[i].y1-1);
}
for(LL i=l;i<=j;++i)
Add(a[i].y1,-a[i].val);
}
int main(){
n=Read(),m=Read();
for(LL i=1;i<=n;++i)
x[++tot1]=a[i].x1=Read()+1,
y[++tot2]=a[i].y1=Read()+1,
a[i].val=1;
for(LL i=1;i<=m;++i){
LL now(n+i);
x[++tot1]=a[now].x1=Read()+1,
y[++tot2]=a[now].y1=Read()+1,
x[++tot1]=a[now].x2=Read()+1,
y[++tot2]=a[now].y2=Read()+1,
a[now].id=i;
}
sort(x+1,x+1+tot1),sort(y+1,y+1+tot2),
tot1=unique(x+1,x+1+tot1)-x-1,tot2=unique(y+1,y+1+tot2)-y-1;
for(LL i=1;i<=n;++i)
a[i].x2=a[i].x1=lower_bound(x+1,x+1+tot1,a[i].x1)-x,
a[i].y1=lower_bound(y+1,y+1+tot2,a[i].y1)-y;
for(LL i=1;i<=m;++i){
LL now(n+i);
a[now].x1=lower_bound(x+1,x+1+tot1,a[now].x1)-x,
a[now].y1=lower_bound(y+1,y+1+tot2,a[now].y1)-y,
a[now].x2=lower_bound(x+1,x+1+tot1,a[now].x2)-x,
a[now].y2=lower_bound(y+1,y+1+tot2,a[now].y2)-y;
}
n+=m,
sort(a+1,a+1+n,cmp1),
Cdq(1,n);
for(LL i=1;i<=m;++i)
printf("%d\n",ans[i]);
return 0;
}

P2163 [SHOI2007]园丁的烦恼的更多相关文章

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

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

  2. P2163 [SHOI2007]园丁的烦恼(cdq分治)

    思路 其实是cdq的板子 题目要求询问对于每个给出的xi,yi,xj,yj形如xi<=x<=xj.yi<=y<=yj的x,y对数有多少组 改成四个询问,拆成四个前缀和的形式后就 ...

  3. bzoj1935 [Shoi2007]园丁的烦恼

    bzoj1935 [Shoi2007]园丁的烦恼 有N个点坐标为(xi,yi),M次询问,询问(a,b)-(c,d)的矩形内有多少点. 0≤n≤500000,1≤m≤500000,0≤xi,yi≤10 ...

  4. [LuoguP2163][SHOI2007]园丁的烦恼_CDQ分治

    园丁的烦恼 题目链接:https://www.luogu.org/problem/P2163 数据范围:略. 题解: 树套树过不去,那就$CDQ$分治好了. 有点小细节,但都是$CDQ$分治必要的. ...

  5. P2163 【[SHOI2007]园丁的烦恼】

    其实是不用把一个询问拆成四个的 把询问转化为数学语言: 对于每个查询,询问满足$a<=x<=b$且$c<=y<=d$的点$x,y$的个数 ~~自然~~想到偏序问题,看到有两个式 ...

  6. luoguP2163 [SHOI2007]园丁的烦恼

    安利系列博文 https://www.cnblogs.com/tyner/p/11565348.html https://www.cnblogs.com/tyner/p/11605073.html 题 ...

  7. BZOJ1935或洛谷2163 [SHOI2007]园丁的烦恼

    BZOJ原题链接 洛谷原题链接 很容易想到二维前缀和. 设\(S[i][j]\)表示矩阵\((0, 0)(i, j)\)内树木的棵数,则询问的矩形为\((x, y)(xx, yy)\)时,答案为\(S ...

  8. [SHOI2007]园丁的烦恼

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

  9. 【[SHOI2007]园丁的烦恼】

    \(CDQ\) 分治的神奇操作 这个问题跟偏序问题好像差的不小啊 但是就是可以转化过去 对于一个查询我们可以把它拆成四个,也就是用二维前缀和的方式来查询 我们发现其实前缀和的定义就是多少个点的横纵坐标 ...

随机推荐

  1. CentOS6安装和卸载docker

    系统版本 [root@bogon yum.repos.d]# uname -a Linux bogon 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 ...

  2. SQL Server统计信息:问题和解决方式

    在网上看到一篇介绍使用统计信息出现的问题已经解决方式,感觉写的很全面. 在自己看的过程中顺便做了翻译. 因为本人英文水平有限,可能中间有一些错误. 假设有哪里有问题欢迎大家批评指正.建议英文好的直接看 ...

  3. Spring事务管理之声明式事务管理-基于注解的方式

    © 版权声明:本文为博主原创文章,转载请注明出处 案例 - 利用Spring的声明式事务(TransactionProxyFactoryBean)管理模拟转账过程 数据库准备 -- 创建表 CREAT ...

  4. smarty模版使用php标签,如何获取模版变量

    smarty模版使用php标签,如何获取模版变量 in: 后端程序 已经assign一个模版变量$assign,由于要做特殊的循环输出,使用for循环,因此使用到了php标签,但是php语句和模版语句 ...

  5. 50条SQL查询技巧、查询语句示例

    学习了 1.查询“001”课程比“002”课程成绩高的所有学生的学号: 2.查询平均成绩大于60分的同学的学号和平均成绩: 3.查询所有同学的学号.姓名.选课数.总成绩: 4.查询姓“李”的老师的个数 ...

  6. Ubuntu 16.04 关闭/打开笔记本触摸板

    由于笔记本触摸板太多灵敏,影响使用,所以禁用掉触摸板. 禁用触摸板命令: sudo rmmod psmouse 启用触摸板命令 sudo modprobe psmouse 注意:启用之后可能会有几秒钟 ...

  7. JAVA读文件和写文件的的代码模版

    有的时候经常为真么读写文件最合理发愁,因为JAVA提过读写文件的方式太多了(C更甚至,fopen & open又有多少人傻傻分不去,更别说ReadFile了). 这里个人绝对比较好的写法,仅供 ...

  8. STL源代码分析--萃取编程(traits)技术的实现

    1.为什么要出现? 依照默认认定.一个模板给出了一个单一的定义,能够用于用户能够想到的不论什么模板參数!可是对于写模板的人而言,这样的方式并不灵活.特别是遇到模板參数为指针时,若想实现与类型的參量不一 ...

  9. 【入门】创建express项目

    1.创建项目(图解) 2.访问http://localhost:3000/就看到熟悉的页面了 3.查看项目目录     参考文档:http://jingyan.baidu.com/article/92 ...

  10. Unity中surfaceShader的处理机制和finalColor

    http://blog.csdn.net/swj524152416/article/details/52945375