当前位置: 首页 > news >正文

二维偏序(离线二维数点)

二维偏序(离线二维数点)

问题

\([l,r]\) 的区间内,有多少个数 \(\le x\)。共 \(m\) 次询问。

暴力:\(O(nm)\) 的 check。效率低下。

离线二维数点

可以将询问离线下来。

首先运用下差分的思想,将 \(ans[l,r]\) 分解为 \(ans[1,r]-ans[1,l-1]\)

所以考虑按照端点从小到大排序,转化为 \(2m\) 个询问。

对于某个询问 \((r,x,id,opt)\)

  • \(r\) 表示询问区间是 \([1,r]\)
  • \(x\) 表示多少个数 \(\le x\)
  • \(id\) 因为是离线,所以需要询问编号。
  • \(opt\) 是该询问的系数。比如 \([1,r]\) 的系数是 \(1\)\([1,l-1]\) 则为 \(-1\)

所以可以将一个询问看成一个点 \((r,x)\)。在平面直角坐标系中,将 \(r\) 看成横坐标,\(x\) 看成 \(y\) 坐标。

那么问题又转化为了对于一个点 \(A(x_a,y_a)\),有多少个点 \(B(x_b,y_b)\) 满足 \(x_a\ge x_b\and y_a\ge y_b\)
画成图就是这样:

所以就可以解释为什么要按照端点下标从小到大排序。

最后我们维护一个可区间操作的数据结构,比如说线段树或树状数组维护 \(y\) 坐标。

如果值很大就离散化一下。

例题

洛谷 P10814 【模板】离线二维数点。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ljl;
#define FUP(i,x,y) for(int i=(x);i<=(y);++i)
#define FDW(i,x,y) for(int i=(x);i>=(y);--i)
inline void Rd(auto &num);
const int N=2e6+5;
int n,m,a[N],tc[N],cntn,ans[N];
struct NODE{int r,x,Id,op;bool operator < (const NODE &oth)const{if(r!=oth.r)return r<oth.r;return x<oth.x;}
}node[N*2];//注意要开2m的空间
//树状数组 begin
int lowbit(int x){return x&(-x);}
void addc(int x)
{for(;x<N;x+=lowbit(x))++tc[x];return;
}
int ask(int x)
{int ans=0;for(;x;x-=lowbit(x))ans+=tc[x];return ans;
}
//树状数组 end
int main(){Rd(n);Rd(m);FUP(i,1,n)Rd(a[i]);FUP(i,1,m){int l,r,x;Rd(l);Rd(r);Rd(x);//拆分为两个询问node[++cntn].r=r;node[cntn].x=x;node[cntn].Id=i;node[cntn].op=1;node[++cntn].r=l-1;node[cntn].x=x;node[cntn].Id=i;node[cntn].op=-1;}sort(node+1,node+cntn+1);int j=1;FUP(i,1,cntn){int u=node[i].r,I=node[i].Id,x=node[i].x,op=node[i].op;while(j<=u)addc(a[j++]);//这里对于所有下标<=u的元素都加进来ans[I]+=ask(x)*op;}FUP(i,1,m)printf("%d\n",ans[i]);return 0;
}
inline void Rd(auto &num)
{num=0;char ch=getchar();bool f=0;while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}while(ch>='0'&&ch<='9'){num=(num<<1)+(num<<3)+(ch-'0');ch=getchar();}if(f)num=-num;return;
}
http://www.jsqmd.com/news/54398/

相关文章:

  • Product Hunt 每日热榜 | 2025-10-30 - 教程
  • 2025年Q4球墨铸铁管厂家TOP5排行榜:场景适配+成本优化,采购选型指南
  • 2025年Q4中国GEO优化公司权威排行榜:TOP5服务商解锁Deepseek高转化,AI搜索营销新标杆
  • WPF的MVVM模式核心架构与达成细节
  • 2025年12月GPU平台哪家好?权威榜单TOP5 低延迟+动态扩容,企业/开发者核心推荐
  • 敏捷冲刺随笔-2
  • 2025年12月高压固态软启动柜厂家排行榜,技术创新+24小时售后,工业采购测评推荐
  • 力扣160 相交链表 java达成
  • `train_test_split` 是什么?
  • 解决LVGL与FATFS编码格式冲突及外挂字库方案
  • 我是如何用浏览器插件轻松抓取抖音评论并实现精准搜索分析的
  • 重练算法(代码随想录版) day24 - 回溯part3
  • useEffect详解
  • 详解np.random.normal(0, 3, size=x.shape)
  • 代码随想录Day23_回溯_组合.md
  • 详细介绍:【JUnit实战3_21】第十二章:JUnit 5 与主流 IDE 的集成 + 第十三章:用 JUnit 5 做持续集成(上):在本地安装 Jenkins
  • 代码随想录Day24_回溯_复原IP.md
  • 何以为生
  • GraphRAG进阶:基于Neo4j与LlamaIndex的DRIFT搜索实现详解
  • Gemini3疯了!0.09接入Nano Banana Pro 4k画质API(附实战教程)
  • 11/28
  • noip板子
  • Webstorm常用配置
  • 东方博宜OJ 1119:求各位数字之和 ← 循环结构
  • 2025.11.28
  • 10个免费查重降重工具分享,降AIGC率工具
  • Linux_Socket_浅谈UDP - 教程
  • Jetlinks 物联网平台 开源版学习源码分析
  • Java 线程池深度解析:原理、策略与生产环境调优指南
  • Tita CRM一体化平台:破解销售管理五大痛点,实现业绩可持续增长