思路

其实是cdq的板子

题目要求询问对于每个给出的xi,yi,xj,yj形如xi<=x<=xj.yi<=y<=yj的x,y对数有多少组

改成四个询问,拆成四个前缀和的形式后就变成熟悉的偏序问题

(query(xj,yj)-query(xj,yi))-(query(xi,yj)-query(xi,yi))

变形为

query(xj,yj)-query(xj,yi)-query(xi,yj)+query(xi,yi)后使用cdq分治套BIT的方法求解

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXL = 1e7+5;
const int MAXN = 500100;
int n,m,ans[MAXN*5],qid,aid,maxy=-1;
namespace BIT{
int bit[MAXL<<1];
int lowbit(int x){
return x&(-x);
}
void add(int pos,int val){
while(pos<=maxy){
bit[pos]+=val;
pos+=lowbit(pos);
}
}
int query(int pos){
int ans=0;
while(pos){
ans+=bit[pos];
pos-=lowbit(pos);
}
return ans;
}
void clear(int pos){
while(pos<=maxy){
if(bit[pos])
bit[pos]=0;
else
break;
pos+=lowbit(pos);
}
}
};
struct Query{
int mode,val,IorD,ansid,posx,posy;
bool operator < (const Query &b) const{
return posx==b.posx?mode<b.mode:posx<b.posx;
};
}query[MAXN*5];
Query tmp[MAXN*5];
void cdq(int L,int R){
if(R<=L+1)
return;
int mid=(L+R)>>1;
cdq(L,mid);
cdq(mid,R);
int l=L,r=mid,tot=0;
while(l<mid&&r<R){
if(query[l]<query[r]){
if(query[l].mode==1)
BIT::add(query[l].posy,1);
tmp[++tot]=query[l];
l++;
}
else{
if(query[r].mode==2)
ans[query[r].ansid]+=query[r].IorD*BIT::query(query[r].posy);
tmp[++tot]=query[r];
r++;
}
}
while(l<mid)
tmp[++tot]=query[l++];
while(r<R){
if(query[r].mode==2)
ans[query[r].ansid]+=query[r].IorD*BIT::query(query[r].posy);
tmp[++tot]=query[r];
r++;
}
for(int i=1;i<=tot;i++){
BIT::clear(tmp[i].posy);
query[L+i-1]=tmp[i];
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
int x,y;
scanf("%d %d",&x,&y);
x++,y++;
maxy=max(maxy,y);
query[++qid].mode=1;
query[qid].posx=x;
query[qid].posy=y;
query[qid].val=1;
}
for(int i=1;i<=m;i++){
int x1,x2,y1,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
x1++,x2++,y1++,y2++;
maxy=max(maxy,max(y1,y2)); query[++qid].ansid=++aid;
query[qid].IorD=1;
query[qid].mode=2;
query[qid].posx=x2;
query[qid].posy=y2; query[++qid].ansid=aid;
query[qid].IorD=-1;
query[qid].mode=2;
query[qid].posx=x2;
query[qid].posy=y1-1; query[++qid].ansid=aid;
query[qid].IorD=-1;
query[qid].mode=2;
query[qid].posx=x1-1;
query[qid].posy=y2; query[++qid].ansid=aid;
query[qid].IorD=1;
query[qid].mode=2;
query[qid].posx=x1-1;
query[qid].posy=y1-1;
}
cdq(0,qid+1);
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
return 0;
}

P2163 [SHOI2007]园丁的烦恼(cdq分治)的更多相关文章

  1. P2163 [SHOI2007]园丁的烦恼

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

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

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

  3. BZOJ 1935: [Shoi2007]Tree 园丁的烦恼 +CDQ分治

    1935: [Shoi2007]Tree 园丁的烦恼 参考与学习:https://www.cnblogs.com/mlystdcall/p/6219421.html 题意 在一个二维平面中有n颗树,有 ...

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

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

  5. BZOJ 1935 Tree 园丁的烦恼 CDQ分治/主席树

    CDQ分治版本 我们把询问拆成四个前缀和,也就是二维前缀和的表达式, 我们把所有操作放入一个序列中 操作1代表在x,y出现一个树 操作2代表加上在x,y内部树的个数 操作3代表减去在x,y内部树的个数 ...

  6. BZOJ1935:[SHOI2007]Tree 园丁的烦恼(CDQ分治)

    Description 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他问一个园丁道: ...

  7. BZOJ.1935.[SHOI2007]Tree园丁的烦恼(CDQ分治 三维偏序)

    题目链接 矩形查询可以拆成四个点的前缀和查询(树套树显然 但是空间不够) 每个操作表示为(t,x,y),t默认有序,对x分治,y用树状数组维护 初始赋值需要靠修改操作实现. //119964kb 43 ...

  8. bzoj1935 [Shoi2007]园丁的烦恼

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

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

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

随机推荐

  1. GGTalk即时通讯系统(支持广域网)终于有移动端了!(技术原理、实现、源码)

    首先要感谢大家一直以来对于GGTalk即时通讯系统的关注和支持!GGTalk即时通讯系统的不断完善与大家的支持分不开! 从2013年最初的GG1.0开放源码以来,到后来陆续增加了网盘功能.远程协助功能 ...

  2. zookeeper开发

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 zookeeper-3.4.11 ZK客户端操作命令: #登 ...

  3. 富文本编辑器kindeditor插件

    官网:http://kindeditor.net/doc.php 步骤

  4. 利用PHP将图片转换成base64编码的实现方法

    先来说一下为什么我们要对图片base64编码 base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一.base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于网络传输. ...

  5. mysql查询语句 查询方式

  6. GUI颜色、字体设置对话框

    %颜色设置对话框 uisetcolor %c 红色 c=uisetcolor %默认规定颜色 c=uisetcolor([ ]); %设置曲线颜色 h = plot([:]); c = uisetco ...

  7. 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition) (优先队列)

    题目链接:http://abc042.contest.atcoder.jp/tasks/abc042_b Time limit : 2sec / Memory limit : 256MB Score ...

  8. sql server 触发器的简单用法

    触发器  -- 一下写的都是我对触发器的理解 当在执行insert . delete . 等操作的时候 随便要做一些额外的操作, 比如在添加的时候就会将新添加的数据存到inserted表中 写个实例 ...

  9. Mysql初级第三天(wangyun)

    1.JDBC简介 1).数据库驱动 2).SUN公司为统一数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. 3).JDBC全称:Java Database Connectivity( ...

  10. Java连接数据库 #01# JDBC单线程适用

    官方教程(包括 javase的基础部分):JDBC Basics 重新梳理.学习一下“Java连接数据库”相关的内容. 因为最开始没有认真学多线程和JDBC,一直在自己写的多线程程序中维持下面的错误写 ...