要求的是所有的存在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<<'\n'; }