标签:p2 le NOIP2011 read Luogu LL int P1314 p1
题意
题目描述
- 给定\(n\)个物品,给定每个物品的 重量 \(w_i\) 和 价值 \(v_i\)
- 给定一个标准值 \(s\) 以及一个参数 \(w\)
- 质检员每次会抽取\(m\)个区间,每次的抽检结果为 \(y = \sum_{l_i}^{r_i} (w_i \ge w) · \sum_{l_i}^{r_i} v_i\)
- 求出 \(\min{\mid{y - s}\mid}\)
数据范围
\(1 \le n,m \le 2^5\), \(0 < w_i, v_i \le 10^6\) \(0 < s \le 10^12\), \(1 \le l_i \le r_i \le n\)
SOLUTION
当 \(y > s\) 的时候, \(y - s > 0\) 当 \(y < s\) 的时候, \(y - s < 0\) 我们想让 \(y\) 尽可能的逼近 \(s\) 对于参数\(w\),当\(w\)越大,\(y\)越小
因此本题具有单调性。 考虑二分\(w\) 使得 \(y\) 尽可能的逼近\(s\) 即可
AC_CODE
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5 + 10;
int n, m, l = INF, r = -INF;
LL s; // 不开 long long 见祖宗 | =^_^= |
int L[N], R[N];
int w[N], v[N];
LL p1[N], p2[N];
LL chk(int x) {
for(int i = 1; i <= n; i ++ ) {
p1[i] = p1[i - 1]; p2[i] = p2[i - 1];
if(w[i] >= x) {
p1[i] += v[i];
p2[i] ++;
}
}
// printf("\n%d\n", x);
LL ANS = 0;
rep(i, 1, m) {
// printf("> %d %d %lld %lld\n",L[i], R[i], (p1[R[i]] - p1[L[i] - 1]) , (p2[R[i]] - p2[L[i] - 1]));
ANS += (p1[R[i]] - p1[L[i] - 1]) * (p2[R[i]] - p2[L[i] - 1]);
}
return ANS;
}
inline void solve() {
read(n); read(m); read(s);
rep(i, 1, n) {
read(w[i]); read(v[i]);
l = min(l, w[i]); r = max(r, w[i]);
}
rep(i, 1, m) {
read(L[i]); read(R[i]);
}
l --, r ++;
LL ans = INFF;
while(l <= r) { // 由于 l = mid + 1, r = mid - 1 因此while循环里面的条件应该是 l <= r
int mid = l + r >> 1;
LL res = chk(mid);
if(res >= s) l = mid + 1; // 如果结果 y > s 我们就让 w 大一点 这样 y就会小一点更逼近 s
else r = mid - 1; //同理
ans = min(ans, abs(res - s));
// printf("> %d %lld\n", mid, res);
}
printf("%lld\n", ans);
}
signed main()
{
// freopen("in.txt", "r", stdin);
solve();
return 0;
}
标签:p2,le,NOIP2011,read,Luogu,LL,int,P1314,p1
来源: https://www.cnblogs.com/c972937/p/15539315.html
本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。