Codeforces Round 932 (Div. 2) C题解

前序:前两道题很水,就不讲了,讲讲C吧。

C. Messenger in MAC

题意:给你n组数字,每组数字有a和b两种属性,我们要做的就是找到可以选的最多数字,保证\sum\limits_{j=1}^{n}a_j +\sum\limits_{j=1}^{n - 1}|b_j - b_{j + 1}| <= L这个式子成立,意思也就是可以选择x个数字,满足此式子。
题解:看到绝对值,可以想到按照b从小到大排序,那这样,就可以保证绝对值是最小的,前面的加法不会有顺序上的问题,这样就可以想到枚举l和r,这样后面的式子就是b_r - b_l,中间不管选多少数字,绝对值求出来的都一样,那么就来看前面的式子,很容易想到贪心,从l <= i <=r中找到x个数字满足b_r - b_l + res <= L,看看最多可以取多少个数字,因为外面的复杂度是O(n^{2}), 那么里面的复杂度需要log的复杂度,那么这样里面就用优先队列或者multiset来维护,因为STL的插入删除以及清空都是log,这样枚举l和r来求出答案取最大值即可。
代码:
#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 2e5 + 7 ;
const int mod = 998244353 ;
inline ll read() {
	ll x = 0, f = 1 ;
	char c = getchar() ;
	while (c > '9' || c < '0') {
		if (c == '-')
			f = -1 ;
		c = getchar() ;
	}
	while (c >= '0' && c <= '9') {
		x = x * 10 + c - '0' ;
		c = getchar() ;
	}
	return x * f ;
}

ll t , n , m , k ;
struct Node{
	ll x , y ;
	bool friend operator < (const Node a , const Node b){
		return a.y < b.y ;
	}
}a[maxn] ;
void solve(){
	n = read() ;
	k = read() ;
	for(int i = 1 ; i <= n ; i ++){
		a[i].x = read() ;
		a[i].y = read() ;
	}
	sort(a + 1 , a + n + 1) ;
	ll ans = -INT_MAX ;
	for(int i = 1 ; i <= n ; i ++){
		priority_queue < ll , vector< ll > , less < ll > > q ;
		ll res = 0 ;
		for(int j = i ; j <= n ; j ++){
			q.push((ll)a[j].x) ;
			res += a[j].x ;
			while(!q.empty() && a[j].y - a[i].y + res > k){
				ll Max = q.top() ;
				res -= Max ;
				q.pop() ;
			}
			ans = max(ans , (ll)q.size()) ;
		}
	}
	cout << ans << endl ;
}
int main(){
	t = read() ;
	while(t --){
		solve() ;
	}
	return 0 ;
}

喜欢作者的记得点赞收藏加关注呀~

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小许愿瓶

我的成长我做主

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值