习题-「土」巨石滚滚
#include <bits/stdc++.h>
using namespace std;
const int N = 500010;
#define int long long
struct Peo{
int a, b;
bool operator < (const Peo w){
//如果都是增加,则应先满足撞得最小
if(b - a > 0 && w.b - w.a > 0) return a < w.a;
//如果都是减少,则应先满足撞后增加的多,因为前面能加的都已经加过,撞不过去就肯定无解
else if(b - a <= 0 && w.b - w.a <= 0) return b > w.b;
//否则选择能增加的
return b - a > w.b - w.a;
}
}p[N];
signed main(){
int t; cin >> t;
while(t--){
int n, m; cin >> n >> m;
for(int i = 1; i <= n; ++i) cin >> p[i].a >> p[i].b;
sort(p + 1, p + 1 + n);
bool flag = true;
for(int i = 1; i <= n; ++i){
m -= p[i].a;
if(m < 0) {flag = false; break;}
m += p[i].b;
}
if(flag) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}