2022-05-22每日刷题打卡
代码源——每日一题
nice party - 题目 - Daimayuan Online Judge
cc准备举办一场派对,他希望邀请他的朋友们过来参加,并且每个人都能玩得开心
cc有 n 位朋友,第 i 位的身价为 i
如果第 i 位朋友参加派对,并且玩得开心,当且仅当派对上至多有 Xi 个人比他身价严格大于他,至多有 Yi 个人身价严格小于他
cc想知道,他最多能邀请来多少人,并且他们每个人都玩得开心
输入描述
第 1 行给出一个数 T ,表示有 T,(1≤T≤104) 组数据
对于每一组数据
第 1 行给出一个数 n,(1≤∑n≤2×105),表示有 n 个朋友
接下来 n 行,每一行给出两个数 Xi,Yi,(0≤Xi,Yi<n)
输出描述
输出一个数,表示cc所能邀请的最多的人的人数
样例输入
3
3
1 2
2 1
1 1
2
0 0
0 1
2
1 0
0 1
样例输出
2
1
2
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<fstream>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#define endl '\n'
#define int ll
typedef long long ll; typedef unsigned long long ull;
typedef pair<ll, ll>PII;
const int N = 1e6 + 50;
ll q, n, a[N], b[N];
bool check(ll x) {
ll c = 0;
for (ll i = 0; i < n; i++) {
if (x - 1 - a[i] <= c && c <= b[i]) c++;
}
return c >= x;
}
signed main()
{
int t;
cin >> t;
while (t--)
{
cin >> n;
for (ll i = 0; i < n; i++) {
cin >> a[i] >> b[i];
}
ll l = -1, r = n + 1, mid;
while (r - l > 1) {
mid = (l + r) >> 1;
if (check(mid)) l = mid;
else r = mid;
}
cout << l << endl;
}
return 0;
}