首页 > 其他分享 >二维偏序问题

二维偏序问题

时间:2024-08-17 23:40:40浏览次数:5  
标签:偏序 10 le int 询问 问题 二维

偏序关系

大概就是,满足自反性,反对称性,传递性。
将严格偏序关系建图,可以得到一个DAG(有向无环图)

二维偏序问题是:给定 \(n\) 个元素,每个元素有\(2\)个属性,定义某种偏序关系,对于所有 \(x_i\) ,求 \(x_j \prec x_i\) 的数量。

一种基本的操作方法是,某个属性按大小排序,另一个属性利用树状数组/线段树进行数量,求和等操作。这种处理方式要依靠在询问可以离线的前提下。

这里有个经典例题,二维数点问题。

P2163 [SHOI2007] 园丁的烦恼

大概题意:

第一行有两个整数 \(n, m\),分别表示点个数和询问次数。
接下来 \(n\) 行,每行两个整数 \(x, y\),表示存在坐标为 \((x, y)\) 的点。有可能存在点位于同一坐标。
接下来 \(m\) 行,每行四个整数 \(a, b, c, d\),表示查询以 \((a, b)\) 为左下角,\((c, d)\) 为右上角的矩形内部(包括边界)有多少个点。
\(0 \le n \le 5 \times 10^5\),\(1 \le m \le 5 \times 10^5\),\(0 \le x, y, a, b, c, d \le 10^7\),\(a \le c\),\(b \le d\)。

初步的想法:对于 \(n\) ,\(m\) 较小的情况,可以用二维前缀和。

可以巧妙的用每个点 \(x\) 值的处理顺序,分隔开询问矩形的 \(x\) 区间的影响。对于 \(y\) 值,用树状数组查询需要的范围。

可以想到以下做法:

对所有的询问离线。将每个矩形拆分成 \((a-1,b-1)(a-1,d)(c,b-1)(c,d)\) 四个点,像前缀和一样算贡献。
依次处理每一个点,将询问点中 \(x’\) 之前的点的 \(y\) 值全部加入树状数组中,在查询 \(y'\) 计算贡献。

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;
}

标签:偏序,10,le,int,询问,问题,二维
From: https://www.cnblogs.com/TanHaoren/p/18362076

相关文章

  • 【问题记录】【Spring】Spring-framework 源码环境搭建
    1 前言换了个电脑,这不是得倒腾代码嘛,这Spring源码还是Gradle管理的依赖,平时接触Gradle就比较少,这家伙这环境给我整的大半天,最后也算是整好了,把中间遇到的各种问题就下,希望大家少走弯路。需要用到的地址我先贴出来,有的需要下载的可以先下载下来:源码:源码下载Gradle:腾讯各......
  • “群如云”小程序解决微信群二维码七天失效问题
    解决群二维码失效问题!!!使用场景:1.印刷海报或者广告需要插入群二维码时,群二维码七天后或者满200人后会自动失效,那印刷出来的海报就不能用了。2.分享群,但群二维码会失效或者满200人后会失效,分享出去的二维码就没有用了。解决方案:使用小程序“群如云”解决这个问题,创......
  • 解决openEuler只有lo无网卡的问题,或者安装过程中没有网卡,添加后也不成功的问题
    安装过后没有网卡的原因即使你手动添加网卡后也没法用,那可能的就是你在选择操作系统版本时候出现了问题,导致的你在安装过程中网卡与当前版本不兼容,或者不兼容导致无法识别不到你的网卡。举个例子:安装openeuler22.03过程中选择版本其他Liunx5.x内核64位就可以识别到网卡,我试......
  • 结合isis、ospf、路由策略的实验;直连引入ospf中,解决路由环路以及次优路径问题
    192.168.1.1:缩写为192第一步:把直连引入ospf中[R5]ipip-prefixdirectindex10permit192.168.1.132[R5]route-policydirect1permitnode10[R5-route-policy]if-matchip-prefixdirect[R5-ospf-1]import-routedirectroute-policydirect1结果:R2或者R3的......
  • Transformer问题总结及实现
    目录前提:注意:以下对于优化的问题,要回答这个问题:前一种方法的局限性在哪里,优化的方法是怎么进行优化的?(未完全解决)Step1:关于Transformer的疑问Step2:关于Transformer各层的实现(未解决)2.1:Encoder细节2.2:Decoder细节2.3:怎么用Transformer提升Kaggle平台的House_pricing竞赛?......
  • stm32 printf 重定向问题
    最终解决方案新建一个stm32_printf.h头文件,在main.c中include#ifndefSTM32_SPIDMA_MODE_STM32_PRINT_H#defineSTM32_SPIDMA_MODE_STM32_PRINT_H#include"stm32f1xx_hal.h"#include"string.h"externUART_HandleTypeDefhuart1;voidprint_f(char*str){......
  • 落猫问题
    2.ThemodelsystemThemodelisafour-particlesystem,showninfigures1and2.Itconsistsofanaxleoflength\(L\).Abouttheendpointstwoperpendicularrodscanrotate.Thesehaveparticlesattachedattheendpoints,oneheavyofmass\(M\)......
  • 非稳态导热微分方程 + 无限大平板的非稳态传热问题
    外层肉和内层肉的球坐标传热微分方程组\[\begin{cases}\dfrac1a\dfrac{\partialT_1}{\partialt}=\dfrac1{r^2}\dfrac\partial{\partialr}\left(r^2\dfrac{\partialT_1}{\partialr}\right)\\[2ex]\dfrac1a\dfrac{\partialT_3}{\partialt}=\dfrac1{r^2}\dfrac\......
  • IPv6无状态地址自动配置(SLAAC)-常见问题
    SLAAC如何工作?主机在启动或接口UP后,发送路由器祈求(RouterSolicitation,RS),路由器收到此消息后,回复路由器宣告(RouterAdvertisement,RA)。此宣告可能是单播给主机的,也可能是多播的,取决于路由器当前的状态(见下文)。路由器在RA中设置M位和O位,针对这两个标志位,解释如下:M位:“Managedadd......
  • powershell命令 域管理: 加入域:将计算机加入指定的 Active Directory 域。 重新加入域
    PowerShell命令示例:域管理加入域:powershellCopyCodeAdd-Computer-DomainName"yourdomain.com"-Credential"yourdomain\username"-Restart重新加入域:powershellCopyCodeRemove-Computer-UnjoinDomainCredential"yourdomain\username"......