【[SHOI2007]园丁的烦恼】
\(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]园丁的烦恼】的更多相关文章
- P2163 [SHOI2007]园丁的烦恼
题目 P2163 [SHOI2007]园丁的烦恼 做法 关于拆点,要真想拆直接全部用树状数组水过不就好了 做这题我们练一下\(cdq\)分治 左下角\((x1,y1)\)右上角\((x2,y2)\), ...
- bzoj1935 [Shoi2007]园丁的烦恼
bzoj1935 [Shoi2007]园丁的烦恼 有N个点坐标为(xi,yi),M次询问,询问(a,b)-(c,d)的矩形内有多少点. 0≤n≤500000,1≤m≤500000,0≤xi,yi≤10 ...
- 洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)
P2163 [SHOI2007]园丁的烦恼 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园 ...
- [LuoguP2163][SHOI2007]园丁的烦恼_CDQ分治
园丁的烦恼 题目链接:https://www.luogu.org/problem/P2163 数据范围:略. 题解: 树套树过不去,那就$CDQ$分治好了. 有点小细节,但都是$CDQ$分治必要的. ...
- P2163 【[SHOI2007]园丁的烦恼】
其实是不用把一个询问拆成四个的 把询问转化为数学语言: 对于每个查询,询问满足$a<=x<=b$且$c<=y<=d$的点$x,y$的个数 ~~自然~~想到偏序问题,看到有两个式 ...
- P2163 [SHOI2007]园丁的烦恼(cdq分治)
思路 其实是cdq的板子 题目要求询问对于每个给出的xi,yi,xj,yj形如xi<=x<=xj.yi<=y<=yj的x,y对数有多少组 改成四个询问,拆成四个前缀和的形式后就 ...
- BZOJ1935或洛谷2163 [SHOI2007]园丁的烦恼
BZOJ原题链接 洛谷原题链接 很容易想到二维前缀和. 设\(S[i][j]\)表示矩阵\((0, 0)(i, j)\)内树木的棵数,则询问的矩形为\((x, y)(xx, yy)\)时,答案为\(S ...
- [SHOI2007]园丁的烦恼
裸的二维数点 #include"cstdio" #include"cstring" #include"iostream" #include& ...
- luoguP2163 [SHOI2007]园丁的烦恼
安利系列博文 https://www.cnblogs.com/tyner/p/11565348.html https://www.cnblogs.com/tyner/p/11605073.html 题 ...
随机推荐
- xcopy命令的其他参数
xcopy /s /e /h "c:\123" "D:\123\" 后面多一个斜杠,让程序知道是目录 以下还给您提供了 xcopy 命令的其他参数: /A 仅复 ...
- mysql:名次排名 (并列与不并列)
http://www.cnblogs.com/zengguowang/p/5541431.html sql语句查询排名 思路:有点类似循环里面的自增一样,设置一个变量并赋予初始值,循环一次自增加1,从 ...
- Java学习--jsp内置对象
九个内置对象,其中Out,request,response,session,application常用 get与post区别: request对象: response对象: 请求转发与请求重定向的区别 ...
- 图解源码之FutureTask篇(AQS应用)
所以,FutureTask既可以由Executor来调度执行,也可以由调度线程调用FutureTask.run()直接执行. FutureTask是通过AQS的模板设计模式来实现阻塞get方法的. 从 ...
- UOJ#172. 【WC2016】论战捆竹竿
传送门 首先这个题目显然就是先求出所有的 \(border\),问题转化成一个可行性背包的问题 一个方法就是同余类最短路,裸跑 \(30\) 分,加优化 \(50\) 分 首先有个性质 \(borde ...
- js中作用域链和作用域
作用域 在JavaScript中,我们可以将作用域定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的子作用域中根据标识符名称(变量名或者函数名)进行变量查找. 经过研究<高级程序设计 ...
- Architecture And Framework
高屋建瓴 From Up to Down. Outside into inside. Interface-Oriented Framework with dynamic configuration. ...
- Visual Studio 与 Visual C++ 关系
Visual Studio .net Visual C++ .net Visual C++ _MSC_VER 备注 Visual Studio .net 2002 Visual C++ .net ...
- Vue.js双向绑定原理
Vue.js最核心的功能有两个,一个是响应式的数据绑定系统,另一个是组件系统.本文仅仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化的代码实现一个简单的hello world示例. 一.访问器属 ...
- Mybatis源码解析优秀博文
最近阅读了许久的mybatis源码,小有所悟.同时也发现网上有许多优秀的mybatis源码讲解博文.本人打算把自己阅读过的.觉得不错的一些博文列出来.以此进一步加深对mybatis框架的理解.其实还有 ...