题意:
每个妹子有两个值为x和y,如果一个妹子的x和y都大于另一个妹子的x和y,那么前一个妹子更重要。因此需要你为n个妹子标上重要值,值越小代表重要越大。
思考:
刚开始一看就是先对x排序,然后去考虑y,这个题就是和我以前做过的一样,最小没有出现过的数之类的反正,这个题就维护y大于当前y的所有妹子中权值最大的那个,然后当前这个妹子的重要度就是最大值+1。以前不会用树状数组维护最大值,现在确实明白树状数组了,就是反正直接前缀和后缀去维护东西就行了。
代码:
struct Node{
int a,b;
int id;
}node[N];
int T,n,m,k;
int va[N];
int anw[N];
int tr[N],R = 1e5+5;
vector<int > v;
int get(int x)
{
return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
}
int bit(int x)
{
return x&(-x);
}
void update(int x,int value)
{
while(x)
{
tr[x] = max(tr[x],value);
x -= bit(x);
}
}
int query(int x)
{
int maxn = 0;
while(x<=R)
{
maxn = max(maxn,tr[x]);
x += bit(x);
}
return maxn;
}
bool cmp(Node A,Node B)
{
if(A.a!=B.a) return A.a<B.a;
return A.b<B.b;
}
signed main()
{
IOS;
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b;
cin>>a>>b;
node[i] = {a,b,i};
v.pb(b);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
sort(node+1,node+1+n,cmp);
for(int i=n;i>=1;i--)
{
int now = get(node[i].b);
anw[node[i].id] = query(now)+1;
update(now,anw[node[i].id]);
}
for(int i=1;i<=n;i++) cout<<anw[i]<<"\n";
return 0;
}
总结:
多多思考。