牛客月赛16-小石的妹子-(树状数组维护最值)

F

题意:
每个妹子有两个值为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;
}

总结:
多多思考。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值