首页 > 其他 > 详细

【二分+前缀和】P1314 聪明的质监员

时间:2019-10-29 15:34:36      阅读:81      评论:0      收藏:0      [点我收藏+]
技术分享图片
 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 = 200010;
33 int w[maxn], v[maxn], l[maxn], r[maxn];
34 LL tot[maxn], num[maxn];
35 LL s, sum;
36 LL ans;
37 int n, m;
38 int maxw = -INF;
39 int minw = INF;
40 
41 bool check(int x)
42 {
43     LL y = 0;
44     sum = 0;
45     mem(num, 0);
46     mem(tot, 0);
47     mfor(i, 1, n)
48     {
49         if (w[i] >= x)
50         {
51             num[i] = num[i - 1] + 1;
52             tot[i] = tot[i - 1] + v[i];
53         }
54         else 
55         {
56             num[i] = num[i - 1];
57             tot[i] = tot[i - 1];
58         }
59     }
60     mfor(i, 1, m)
61     {
62         y += (num[r[i]] - num[l[i] - 1]) * (tot[r[i]] - tot[l[i] - 1]);
63     }
64     sum = y - s;
65     if (sum < 0) sum = -sum;
66     return y > s;
67 }
68 int main() 
69 {
70     cin >> n >> m >> s;
71     mfor(i, 1, n)
72     {
73         cin >> w[i] >> v[i];
74         maxw = max(maxw, w[i]);
75         minw = min(minw, w[i]);
76     }
77     mfor(i, 1, m)
78     {
79         cin >> l[i] >> r[i];
80     }
81     int left = minw - 1, right = maxw + 1;
82     ans = INFLL;
83     while (left < right)
84     {
85         int mid = (left + right) >> 1;
86         if (check(mid))  left = mid + 1;
87         else right = mid;
88         ans = min(ans, sum);
89     }
90     cout << ans;
91     return 0;
92 }
View Code

 

【二分+前缀和】P1314 聪明的质监员

原文:https://www.cnblogs.com/thjkhdf12/p/11758381.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!