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]园丁的烦恼的更多相关文章
- 洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)
		
P2163 [SHOI2007]园丁的烦恼 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园 ...
 - P2163 [SHOI2007]园丁的烦恼(cdq分治)
		
思路 其实是cdq的板子 题目要求询问对于每个给出的xi,yi,xj,yj形如xi<=x<=xj.yi<=y<=yj的x,y对数有多少组 改成四个询问,拆成四个前缀和的形式后就 ...
 - bzoj1935 [Shoi2007]园丁的烦恼
		
bzoj1935 [Shoi2007]园丁的烦恼 有N个点坐标为(xi,yi),M次询问,询问(a,b)-(c,d)的矩形内有多少点. 0≤n≤500000,1≤m≤500000,0≤xi,yi≤10 ...
 - [LuoguP2163][SHOI2007]园丁的烦恼_CDQ分治
		
园丁的烦恼 题目链接:https://www.luogu.org/problem/P2163 数据范围:略. 题解: 树套树过不去,那就$CDQ$分治好了. 有点小细节,但都是$CDQ$分治必要的. ...
 - P2163 【[SHOI2007]园丁的烦恼】
		
其实是不用把一个询问拆成四个的 把询问转化为数学语言: 对于每个查询,询问满足$a<=x<=b$且$c<=y<=d$的点$x,y$的个数 ~~自然~~想到偏序问题,看到有两个式 ...
 - luoguP2163 [SHOI2007]园丁的烦恼
		
安利系列博文 https://www.cnblogs.com/tyner/p/11565348.html https://www.cnblogs.com/tyner/p/11605073.html 题 ...
 - BZOJ1935或洛谷2163 [SHOI2007]园丁的烦恼
		
BZOJ原题链接 洛谷原题链接 很容易想到二维前缀和. 设\(S[i][j]\)表示矩阵\((0, 0)(i, j)\)内树木的棵数,则询问的矩形为\((x, y)(xx, yy)\)时,答案为\(S ...
 - [SHOI2007]园丁的烦恼
		
裸的二维数点 #include"cstdio" #include"cstring" #include"iostream" #include& ...
 - 【[SHOI2007]园丁的烦恼】
		
\(CDQ\) 分治的神奇操作 这个问题跟偏序问题好像差的不小啊 但是就是可以转化过去 对于一个查询我们可以把它拆成四个,也就是用二维前缀和的方式来查询 我们发现其实前缀和的定义就是多少个点的横纵坐标 ...
 
随机推荐
- Kafka备忘
			
官网 http://kafka.apache.org/ 多生产者多消费者 多topic和多分区 多消费者组.每组中消息不能重复消费,组间不影响 启动 RunKafka(){ cd $kafka_hom ...
 - asp.net core mvc视频A:笔记3-5.视图数据共享之TempData
			
前几节讲的都是单页面数据共享,从本节开始讲跨页面数据共享 创建项目3.5,新建控制器 代码 控制器 设置TempData 另一个视图中读取TempData数据 运行 此时如果刷新页面,页面中的内容“张 ...
 - cache和内存
			
CPU与内存 北桥:主桥,主要用来处理高速信号,负责与处理器的联系:CPU通过FSB前端总线来访问内存控制器. 南桥:IO桥,负责IO总线之间的通信,比如PCI总线.SATA.USB等,可以连接光驱. ...
 - java -cp  命令 java jar 命令和 hadoop jar 命令
			
-cp 和 -classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上分号“;” java -cp .;myClass.jar pa ...
 - CentOS7如何使用U盘安装
			
前段时间给一台没有光驱的PC安装CentOS7(CentOS-7.0-1406-x86_64-DVD.iso),惯例直接用Universal-USB-Installer直接转换镜像至U盘,顺利启动,却 ...
 - MIC中示例程序计算π
			
mic中编程十分简单,只需在普通程序中简单加几句就可以,使用 lspci|grep -i -co-processor 命令可以查看机器中是否插入MIC卡以及MIC卡的数目,MIC编程环境的配置这里就不 ...
 - 恢复不小心误覆盖的代码文件 (sublime编辑器)
			
最新写了一个python脚本,另外在终端上运行一个shell脚本循环记录一些性能.耗时参数.取出记录的数据,使用python pyplot强大的绘图功能来可视化,易用程度仅次于matlab. 本次文件 ...
 - Android Handler警告,SimpleDateFormat警告
			
1:Handler// This Handler class should be static or leaks might occur: IncomingHandler @SuppressLi ...
 - 卸载系统自带libevent
			
rpm -qa|grep libevent yum remove libevent* 或 rpm -e --nodeps --allmatches libevent*
 - Mac下python连接mysql数据库
			
一.下载Mysql官方connector驱动 地址:https://dev.mysql.com/downloads/connector/python/ 根据提示安装.dmg文件即可. 二.验证是否安装 ...