description:
有n个妹子 分别有a,b值 只有a,b值均大于其他人才能设定为一个阶级的重要程度(具体看题目样例) 列出所有妹子的重要程度
solution:
二维点数问题.想到树状数组,我们只关心他们之间的相对大小,对于维度x采用离散化,然后对维度y降序排序,用树状数组维护当前重要程度最大值,对于每个人按照维度x更新和查询,查询出来的值 +1 是用来区分不同重要程度,选择对应下标存入res数组最后输出
code:
#include <bits/stdc++.h> using namespace std; struct node{ int x,y; int id; }; const int N = 1e5 + 50; node a[N]; int res[N],t[N]; bool cmp(node a,node b){ return a.y > b.y; } int lowbit(int x){ return x & (-x); } void update(int i,int v){ for(;i > 0;i -= lowbit(i)){ t[i] = max(t[i],v); } } int query(int i){ int res = 0; for(;i < N;i += lowbit(i)){ res = max(res,t[i]); } return res; } int main(){ ios::sync_with_stdio(0); int n ;cin >> n; vector<int> v; for(int i = 1;i <= n;i ++){ cin >> a[i].x >> a[i].y; a[i].id = i; v.push_back(a[i].x); } sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); for(int i = 1;i <= n;i ++){ a[i].x = lower_bound(v.begin(),v.end(),a[i].x) - v.begin() + 1; } sort(a + 1,a + 1 + n,cmp); for(int i = 1;i <= n;i ++){ int now = query(a[i].x); res[a[i].id] = now + 1; update(a[i].x,now + 1); } for(int i = 1;i <= n;i ++){ cout << res[i] << '\n'; } return 0; }