二维偏序

Posted liulex

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维偏序相关的知识,希望对你有一定的参考价值。

Laptop

要求的是所有的存在s,w都比它大的物品的物品的个数

正着不好去重

倒着枚举s,当前位置后面的物品s都比它大,减掉w比他小的,就能判断是否有w也比他大的

如果有 ans++

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define sc(x) scanf("%lld",&x);
#define si signed
int n;
int M[100005];
int S[100005];
int I[100005];
int m[100005];
int B[100005];
bool cmp(int x,int y)
{
    return S[x]<S[y];
}
void add(int x)
{
    int i=x;
    for(;i<=100000;i+=(i&(-i))){
        B[i]++;
    }
}
int ask(int x)
{
    int i=x;
    int ans=0;
    for(;i>0;i-=(i&(-i))){
        ans+=B[i];
        //cout<<ans<<endl;
    }
    return ans;
}
si main()
{
    sc(n);
    for(int i=1;i<=n;i++){
        sc(M[i])sc(S[i])
        I[i]=i;m[i]=M[i];
    }
    sort(I+1,I+n+1,cmp);
    sort(m+1,m+1+n);
    int len=unique(m+1,m+1+n)-(m+1);

    for(int i=1;i<=n;i++)
     M[i]= lower_bound(m+1,m+1+len,M[i])-(m);

    int ans=0;
    //cout<<"TRUE"<<endl;
    for(int i=n;i>=1;i--){
        int t=ask(M[I[i]]);

        if(n-t-i>0)ans++;
        //cout<<ans<<endl;
        add(M[I[i]]);
    }
    cout<<ans<<
;
}

 

10114. 「一本通 4.1 例 2」数星星 Stars

排序时注意下第二个维度

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define sc(x) scanf("%lld",&x);
#define si signed
int n;
int M[100005];
int S[100005];
int I[100005];
int m[100005];
int B[100005];
int Ans[100005];
bool cmp(int x,int y)
{
    if(S[x]==S[y])return M[x]<M[y];
    return S[x]<S[y];
}
void add(int x)
{
    int i=x;
    for(;i<=100000;i+=(i&(-i))){
        B[i]++;
    }
}
int ask(int x)
{
    int i=x;
    int ans=0;
    for(;i>0;i-=(i&(-i))){
        ans+=B[i];
        //cout<<ans<<endl;
    }
    return ans;
}
si main()
{
    sc(n);
    for(int i=1;i<=n;i++){
        sc(M[i])sc(S[i])
        I[i]=i;m[i]=M[i];
    }
    sort(I+1,I+n+1,cmp);
    sort(m+1,m+1+n);
    int len=unique(m+1,m+1+n)-(m+1);

    for(int i=1;i<=n;i++)
     M[i]= lower_bound(m+1,m+1+len,M[i])-(m);

    int ans=0;
    //cout<<"TRUE"<<endl;
    for(int i=1;i<=n;i++){
        int t=ask(M[I[i]]);

        Ans[t]++;
        //cout<<ans<<endl;
        add(M[I[i]]);
    }
    for(int i=0;i<n;i++){
        cout<<Ans[i]<<endl;
    }
}

 

以上是关于二维偏序的主要内容,如果未能解决你的问题,请参考以下文章

二维偏序

专题偏序,扫描线

二维偏序

BZOJ 1537 二维偏序

二维偏序关系 单个值传递

luogu模板三维偏序(陌上花开)