链接:
https://www.nowcoder.com/acm/contest/16/A
来源:牛客网
来源:牛客网
题目描述
FST是一名可怜的小朋友,他很强,但是经常fst,所以rating一直低迷。
但是重点在于,他非常适合ACM!并在最近的区域赛中获得了不错的成绩。
拿到奖金后FST决定买一台新笔记本,但是FST发现,在价格能承受的范围内,笔记本的内存和速度是不可兼得的。
可是,有一些笔记本是被另外一些“完虐”的,也就是内存和速度都不高于另外某一个笔记本,现在FST想统计一下有多少笔记本被“完虐”。
但是重点在于,他非常适合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 <bits/stdc++.h>
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<int,int>
#define pll pair<ll,ll>
#define pli pair<ll,int>
#define pil pair<int,ll>
#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<typename T, typename S>
void upmax(T& a,S b){if(a<b) a=b;}
template<typename T, typename S>
void upmin(T& a,S b){if(a>b) a=b;}
template<typename T>
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<pii> VV;
vector<int> 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;
}