其实是不用把一个询问拆成四个的

把询问转化为数学语言:

对于每个查询,询问满足$a<=x<=b$且$c<=y<=d$的点$x,y$的个数

~~自然~~想到偏序问题,看到有两个式子,二维偏序?好像办不到,反正我不会

如何升维,拆分即可

把原式拆成$a<=x,x<=b,c<=y,y<=d$,这样就可以用四维偏序解决了,但是这样的复杂度显然是不能保证的

尝试降维

如果这样呢$a<=x,x<=b,c<=y<=d$

对于一个点,我们定义其三个维度为:

$a,b->x$即以横坐标作为第一维和第二维

$c->y$即以纵坐标作为第三维

而查询,依照上式,我们定义其维度

以$a$为第一维,$c$为第二维,$b,d$为三维和四维(查询用)

所以三维偏序的式子就是

$a_i<=a_j,b_i>=b_j,c_i<=c_j<=d_i$

考虑重复元素的贡献问题,记得排序时加上$c$相同,按$d$排

上代码(其实是要写离散化的,但是我懒得写,拿$O2$替了)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=5e5+,maxl=1e7+;
struct node{
int a,b,c,d,w,mp;
}v[*maxn];
int n,m,c[maxl],ans[maxn];
bool cmpy(const node &a,const node &b)
{
return a.b==b.b?(a.c==b.c?a.d<b.d:a.c>b.c):a.b<b.b;
}
bool cmpx(const node &a,const node &b)
{
return a.a==b.a?cmpy(a,b):a.a>b.a;
}
int lowbit(int x)
{
return x&-x;
}
void add(int x,int ch)
{
while(x<=maxl-)
{
c[x]+=ch;
x+=lowbit(x);
}
}
int sum(int x)
{
int ret=;
while(x)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void cdq(int l,int r)
{
if(l==r)
return;
int mid=l+r>>;
cdq(l,mid),cdq(mid+,r);
sort(v+l,v+mid+,cmpy),sort(v+mid+,v+r+,cmpy);
int i=l,j=mid+;
for(;j<=r;j++)
{
while(v[i].b<=v[j].b&&i<=mid)
add(v[i].c,v[i].w),i++;
ans[v[j].mp]+=sum(v[j].d)-sum(v[j].c-);
}
for(j=l;j<i;j++)
add(v[j].c,-v[j].w);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d%d",&v[i].a,&v[i].c);
v[i].a++,v[i].c++;
v[i].b=v[i].a,v[i].w=,v[i].d=v[i].mp=;
}
for(int i=n+;i<=n+m;i++)
{
scanf("%d%d%d%d",&v[i].a,&v[i].c,&v[i].b,&v[i].d);
v[i].a++,v[i].b++,v[i].c++,v[i].d++;
v[i].w=,v[i].mp=i-n;
}
sort(v+,v+n+m+,cmpx);
cdq(,n+m);
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
return ;
}

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

  1. P2163 [SHOI2007]园丁的烦恼

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

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

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

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

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

  4. bzoj1935 [Shoi2007]园丁的烦恼

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

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

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

  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. java代码示例(6-1)

     创建Administrator.java /** * 需求分析:定义用户名,密码 * @author chenyanlong * 日期:2017/10/15 */ package com.hp.te ...

  2. Scala进阶之路-反射(reflect)技术详解

    Scala进阶之路-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Scala中的反射技术和Java反射用法类似,我这里就不一一介绍反射是啥了,如果对 ...

  3. Swift学习笔记6

    1.用类型检查操作符(is)来检查一个实例是否属于特定子类型.若实例属于那个子类型,类型检查操作符返回 true,否则返回 false. 2.某类型的一个常量或变量可能在幕后实际上属于一个子类.当确定 ...

  4. python---自定义字段验证

    各个字段类,含正则和验证方法 #字段类 class IPField: REGULAR = "^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4] ...

  5. ThinkPHP 3.2 用户注册邮箱验证激活帐号

    本文将结合实例,讲解如何使用PHP+Mysql完成注册帐号.发送激活邮件.验证激活帐号.处理URL链接过期的功能. 业务流程 1.用户提交注册信息. 2.写入数据库,此时帐号状态未激活. 3.将用户名 ...

  6. Nginx 流量带宽等请求状态统计( ngx_req_status)

    Nginx 流量带宽等请求状态统计 ( ngx_req_status)  插件下载地址: wget http://nginx.org/download/nginx-1.4.2.tar.gz git c ...

  7. [C++]Linux之图形界面编程库[curses库]之入门教程

    1. 安装 //方法一 sudo apt-get install libncurses5-dev [ ubuntu 16.04:亲测有效] //方法二 sudo apt-get install ncu ...

  8. luogu P2779 [AHOI2016初中组]黑白序列

    传送门 注:本题解中下标从1开始 这题可以想出一个\(O(n^2)\)的dp,只要考虑每个偶数位置可以从前面的哪个位置加上一个"B...W..."转移过来 然而数据范围有5e5,, ...

  9. luogu P4342 [IOI1998]Polygon

    IOI早期这么多dp? 题目要求断掉环上的一边,我们可以断环为链,开两倍数组 容易想到dp,设\(f_{i,j}\)为区间\([i,j]\)的最大值,然后就是个枚举断点的区间dp 不过可能会有负数出现 ...

  10. python2的比较函数,cmp

    class Shu(object): def __init__(self,ss): self.ss = ss def __str__(self): return '(%s: %s)' % (self. ...