二维偏序
Posted liulex
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维偏序相关的知识,希望对你有一定的参考价值。
要求的是所有的存在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; } }
以上是关于二维偏序的主要内容,如果未能解决你的问题,请参考以下文章