牛客练习赛A二维偏序

链接: https://www.nowcoder.com/acm/contest/16/A
来源:牛客网

题目描述

FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。
但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。
拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。
可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。

输入描述:

第一行一个正整数n,
表示笔记本的数量。接下来n行,每行两个正整数Mi,Si表示这款笔记本的内存和速度。
n≤105,Mi,Si≤109

输出描述:

一行,一个正整数,表示被完虐的笔记本数。
示例1

输入

4
100 700
200 500
50 100
300 400

输出

1

备注:

Mi和Si都是越大越优。
数据保证Mi互不相同,Si也互不相同。

题解:二维偏序定理,我们按照其中一维排序,在另一维进行树状数组查询以及更新。

#include 

using namespace std;
typedef long long ll;
typedef long double ld;

#define x0 x0___
#define y0 y0___
#define pb push_back
#define SZ(X) ((int)X.size())
#define mp make_pair
#define fi first
#define se second
#define pii pair
#define pll pair
#define pli pair
#define pil pair
#define ALL(X) X.begin(),X.end()
#define RALL(X) X.rbegin(),X.rend()
#define rep(i,j,k) for(int i = j;i <= k;i ++)
#define per(i,j,k) for(int i = j;i >= k;i --)
#define mem(a,p) memset(a,p,sizeof(a))


const ll MOD = 1E9 + 7;
ll qmod(ll a,ll b,ll c) {ll res=1;a%=c; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%c;a=a*a%c;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}

template
void upmax(T& a,S b){if(a
void upmin(T& a,S b){if(a>b) a=b;}
template
void W(T b){cout << b << endl;}
void gettle() {while(1);}
void getre() {int t=0;t/=t;}


/
/
/
/



const int N = 1E5 + 7;

int bit[N];
int n;

void add(int x, int d)
{
    for(;x<=n;x+=x&-x) bit[x] += d;
}
int query(int x)
{
    int s = 0;
    for(;x;x-=x&-x) s += bit[x];
    return s;
}

int main()
{

    int m, s;
    scanf("%d", &n);
    vector VV;
    vector V;
    rep (i,1,n) {
        scanf("%d %d", &m, &s);
        VV.pb({m, s});
        V.pb(s);
    }
    sort(ALL(V));
    sort(ALL(VV));

    int res = 0;
    per (i,n-1,0) {
        int pos = lower_bound(ALL(V),VV[i].second) - V.begin() + 1;
        if(query(n)-query(pos)) res ++;
        add(pos, 1);
    }

    printf("%d\n", res);
    return 0;
}



















你可能感兴趣的:(很套路的题,偏序集相关)