二维偏序问题
偏序关系:
大概就是,满足自反性,反对称性,传递性。
将严格偏序关系建图,可以得到一个DAG(有向无环图)
二维偏序问题是:给定
一种基本的操作方法是,某个属性按大小排序,另一个属性利用树状数组/线段树进行数量,求和等操作。这种处理方式要依靠在询问可以离线的前提下。
这里有个经典例题,二维数点问题。
大概题意:
第一行有两个整数
,分别表示点个数和询问次数。
接下来行,每行两个整数 ,表示存在坐标为 的点。有可能存在点位于同一坐标。
接下来行,每行四个整数 ,表示查询以 为左下角, 为右上角的矩形内部(包括边界)有多少个点。
, , , , 。
初步的想法:对于
可以巧妙的用每个点
可以想到以下做法:
对所有的询问离线。将每个矩形拆分成
依次处理每一个点,将询问点中
Code:
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
inline int read(){
int f=1,x=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return f*x;
}
int n,m;
int cnt1;
struct node{
int x,y;
int id,ff;
bool operator<(const node& p)const{
if(x==p.x)return y<p.y;
else return x<p.x;
}
}a[N],b[N*4];
int ans[N];
int mp[N*3],len;
int c[N*3];
inline int lowbit(int x){
return x&-x;
}
inline void upd(int x,int w){
for(int i=x;i<=len;i+=lowbit(i)){
c[i]+=w;
}
}
inline int qur(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)){
res+=c[i];
}
return res;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
a[i].x=read(),a[i].y=read();
mp[++len]=a[i].y;
}
sort(a+1,a+1+n);
for(int i=1;i<=m;i++){
int xa=read(),ya=read(),xb=read(),yb=read();
b[++cnt1]={xa-1,ya-1,i,1};
b[++cnt1]={xa-1,yb,i,-1};
b[++cnt1]={xb,ya-1,i,-1};
b[++cnt1]={xb,yb,i,1};
mp[++len]=ya-1,mp[++len]=yb;
}
sort(b+1,b+1+cnt1);
sort(mp+1,mp+1+len);
len=unique(mp+1,mp+1+len)-mp-1;
for(int i=1;i<=n;i++){
a[i].y=lower_bound(mp+1,mp+1+len,a[i].y)-mp;
}
for(int i=1;i<=cnt1;i++){
b[i].y=lower_bound(mp+1,mp+1+len,b[i].y)-mp;
}
int now=0;
for(int i=1;i<=cnt1;i++){
int x=b[i].x,y=b[i].y;
int id=b[i].id,ff=b[i].ff;
while(now+1<=n&&a[now+1].x<=x){
now++;
upd(a[now].y,1);
}
ans[id]+=qur(y)*ff;
}
for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
return 0;
}
当然,更多的并不是这样明显的二维偏序关系,常常需要观察得出偏序关系是什么,应该怎么处理。
给出几个例题,介绍一下思路。
例题1:P8844 [传智杯 #4 初赛] 小卡与落叶
给你一棵有
个结点的有根树,根结点标号为 ,根节点的深度为 ,最开始整棵树的所有结点都是绿色的。 小卡有
个操作。 操作一:把整棵树都染绿,之后让深度
的结点变黄。 操作二:询问一个结点
的子树中有多少个黄色结点。
首先可以想到暴力做法。每次询问都暴力查询深度
接下来考虑怎么优化。如何询问整个子树内的节点状态?可以想到 dfs序。在一个子树内,dfs序是连续的。一个子树
于是问题就转化成,在查询某个
时间为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!