\(CDQ\) 分治的神奇操作

这个问题跟偏序问题好像差的不小啊

但是就是可以转化过去

对于一个查询我们可以把它拆成四个,也就是用二维前缀和的方式来查询

我们发现其实前缀和的定义就是多少个点的横纵坐标都小于这个点

典型的偏序问题

于是直接上\(cdq\)了

代码


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define re register
#define maxn 500005
#define LL long long
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define lowbit(x) ((x)&(-x))
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
struct Node
{
int x,y,ans,o,rk;
}b[maxn*5],a[maxn*5];
int c[2][maxn*10];
int n,m,tot,num;
int sz[2],Ans[maxn];
int bit[maxn*10];
inline int ask(int x){int now=0;for(re int i=x;i;i-=lowbit(i)) now+=bit[i];return now;}
inline void add(int x,int val){for(re int i=x;i<=sz[1];i+=lowbit(i)) bit[i]+=val;}
inline int find(int x,int o)
{
int l=1,r=sz[o];
while(l<=r)
{
int mid=l+r>>1;
if(c[o][mid]==x) return mid;
if(c[o][mid]>x) r=mid-1;
else l=mid+1;
}
return 0;
}
inline int cmp(Node A,Node B)
{
if(A.x==B.x) return A.y<B.y;
return A.x<B.x;
}
void CDQ(int s,int t)
{
if(s==t) return;
int mid=s+t>>1;
CDQ(s,mid),CDQ(mid+1,t);
int i=s,j=mid+1,p=i;
while(i<=mid&&j<=t)
{
if(b[i].x<=b[j].x)
{
if(!b[i].o) add(b[i].y,1);
a[p++]=b[i++];
}
else
{
if(b[j].o) b[j].ans+=ask(b[j].y);
a[p++]=b[j++];
}
}
while(j<=t)
{
if(b[j].o) b[j].ans+=ask(b[j].y);
a[p++]=b[j++];
}
for(re int k=s;k<i;k++) if(!b[k].o) add(b[k].y,-1);
while(i<=mid) a[p++]=b[i++];
for(re int k=s;k<=t;k++) b[k]=a[k];
}
int main()
{
n=read(),m=read();
tot=0;
for(re int i=1;i<=n;i++)
b[i].x=read(),b[i].y=read(),c[0][++tot]=b[i].x,c[1][tot]=b[i].y;
num=n;
int xx,yy,X,Y;
for(re int i=1;i<=m;i++)
{
xx=read(),yy=read(),X=read(),Y=read(); b[++num].x=X,b[num].y=Y,b[num].o=1,b[num].rk=i;
c[0][++tot]=b[num].x,c[1][tot]=b[num].y; b[++num].x=xx-1,b[num].y=yy-1,b[num].o=1,b[num].rk=i;
c[0][++tot]=b[num].x,c[1][tot]=b[num].y; b[++num].x=X,b[num].y=yy-1,b[num].o=2,b[num].rk=i;
c[0][++tot]=b[num].x,c[1][tot]=b[num].y; b[++num].x=xx-1,b[num].y=Y,b[num].o=2,b[num].rk=i;
c[0][++tot]=b[num].x,c[1][tot]=b[num].y;
}
std::sort(c[0]+1,c[0]+tot+1);
std::sort(c[1]+1,c[1]+tot+1);
sz[0]=std::unique(c[0]+1,c[0]+tot+1)-c[0]-1;
sz[1]=std::unique(c[1]+1,c[1]+tot+1)-c[1]-1;
for(re int i=1;i<=num;i++)
b[i].x=find(b[i].x,0),b[i].y=find(b[i].y,1);
CDQ(1,num);
for(re int i=1;i<=num;i++)
{
if(!b[i].o) continue;
if(b[i].o==1) Ans[b[i].rk]+=b[i].ans;
else Ans[b[i].rk]-=b[i].ans;
}
for(re int i=1;i<=m;i++)
printf("%d\n",Ans[i]);
return 0;
}

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

  1. P2163 [SHOI2007]园丁的烦恼

    题目 P2163 [SHOI2007]园丁的烦恼 做法 关于拆点,要真想拆直接全部用树状数组水过不就好了 做这题我们练一下\(cdq\)分治 左下角\((x1,y1)\)右上角\((x2,y2)\), ...

  2. bzoj1935 [Shoi2007]园丁的烦恼

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

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

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

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

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

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

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

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

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

  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. luoguP2163 [SHOI2007]园丁的烦恼

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

随机推荐

  1. 如何应用ASP.NET MVC中的分部视图

    概述: 在ASP.NET Web Form的开发经验中,对于User Control使用比较频繁,可以减少重复的代码,利于页面模块化,这个概念也被引入了ASP.NET MVC.即“分部视图”. 1.创 ...

  2. 【10】Quartz.net 定时服务实例

    一.安装nuget包 Install-Package Quartz Install-Package Common.Logging.Log4Net1211 Install-Package log4net ...

  3. 出现<authentication mode="Windows"/>错误解决办法

    转自:https://blog.csdn.net/clever101/article/details/39671715 网上下载的asp.net源码出现 <authentication mode ...

  4. fzou 1759 Super A^B mod C

    Problem 1759 Super A^B mod CAccept: 456    Submit: 1488Time Limit: 1000 mSec    Memory Limit : 32768 ...

  5. linux ssh免密登陆

    大致流程: 两台linux系统A B 如果A要登陆到B 1.生成A的密钥对 2.将A的公钥拷贝到B的authorized_keys中即可 可以使用命令:ssh-copy-id -i ~/.ssh/id ...

  6. Q:接口与抽象类

    博文回答一下两个问题: 接口和抽象类的区别 选用接口和抽象类的依据 对于问题1: 从java语法的角度上来说,接口的所有成员和方法都是public的,且其方法均为abstract的.直到jdk1.8之 ...

  7. 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)

    题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...

  8. 【js常用DOM方法】

    介绍几个js DOM的常用方法 获取元素节点 getElementById  getElementsByTagName  getElementsByClassName 先写一个简单的网页做测试: /* ...

  9. JDBC中处理事务,小Demo

    事务的四大特性(ACID):  原子性(Atomicity):事务中所有操作是不可再分割的原子单位.事务中所有操作要么全部执行成功,要么全部执行失败.  一致性(Consistency):事务执行 ...

  10. Google Map API V3调用arcgis发布的瓦片地图服务

    由于最近项目需要用到CAD制作的地图,但之前一直使用的是用谷歌离线瓦片地图的方式,怎么样把CAD图像地图一样有缩放,移动的功能放到网页显示成了难题, 原先的谷歌地图的代码难道就不能用了?重新写一套代码 ...