【codeforces 19/10/24 div2】D. Salary Changing

时间:2019-10-25
本文章向大家介绍【codeforces 19/10/24 div2】D. Salary Changing,主要包括【codeforces 19/10/24 div2】D. Salary Changing使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
 1 #include<iostream>
 2 #include<string>
 3 #include<queue>
 4 #include<stack>
 5 #include<vector>
 6 #include<map>
 7 #include<cstdio>
 8 #include<cstdlib>
 9 #include<algorithm>
10 #include<set>
11 #include<list>
12 #include<iomanip>
13 #include<cstring>
14 #include<cmath>
15 #include<limits>
16 using namespace std;
17 
18 #define au auto
19 #define debug(i) cout<<"<debug> "<<i<<" <\debug>"<<endl
20 #define mfor(i,a,b) for(register int i=(a);i<=(b);i++)
21 #define mrep(i,a,b) for(register int i=(a);i>=(b);i--)
22 #define LLL __int128
23 #define Re register
24 #define il inline
25 #define mem(a,b) memset(a,(b),sizeof(a))
26 typedef pair<int, int> intpair;
27 typedef pair<long long int, long long int> llpair;
28 typedef long long int LL;
29 const int INF = 0x3f3f3f3f;
30 const long long int INFLL = 0x3f3f3f3f3f3f3f3f;
31 
32 const int maxn = 100010;
33 
34 LL n;
35 LL s;
36 LL ans;
37 int T;
38 llpair a[maxn];
39 
40 bool operator >(llpair a, llpair b)
41 {
42     return a.first > b.first;
43 }
44 
45 bool check(LL x)
46 {
47     LL t = (n >> 1) + 1;
48     LL sum = 0;
49     mfor(i, 1, n)
50     {
51         if (t && a[i].first <= x && x <= a[i].second)
52         {
53             sum += x;
54             t--;
55         }
56         else
57         {
58             sum += a[i].first;
59             if (a[i].first >= x && t) t--;
60         }
61     }
62     if (t) return 0;
63     return sum <= s;
64 }
65 
66 int main()
67 {
68     ios::sync_with_stdio(0);
69     cin.tie(0);
70     cout.tie(0);
71     cin >> T;
72     while (T--)
73     {
74         ans = 0;
75         cin >> n >> s;
76         mfor(i, 1, n) cin >> a[i].first >> a[i].second;
77         sort(a + 1, a + n + 1, greater<llpair>());
78         LL l = a[(n >> 1) + 1].first, r = s;
79         ans = a[(n >> 1) + 1].first;
80         while (l <= r)
81         {
82             LL mid = (l + r) >> 1;
83             if (check(mid))
84             {
85                 ans = mid;
86                 l = mid + 1;
87             }
88             else r = mid - 1;
89         }
90         cout << ans << endl;
91     }
92 }
View Code

原文地址:https://www.cnblogs.com/thjkhdf12/p/11737565.html