这个题我第一反应是线段树(雾),然后看了一眼题解之后就后悔了。。。前缀和。。。然后二分答案,然后就没有然后了。

题干:

小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 nnn 个矿石,从  到 nnn 逐一编号,每个矿石都有自己的重量 wiw_iwi​ 以及价值 viv_ivi​ 。检验矿产的流程是:

 、给定 mmm 个区间 [Li,Ri][L_i,R_i][Li​,Ri​] ;

 、选出一个参数 W WW ;

 、对于一个区间 [Li,Ri][L_i,R_i][Li​,Ri​] ,计算矿石在这个区间上的检验值 YiY_iYi​ :

这批矿产的检验结果 YYY 为各个区间的检验值之和。即: Y1+Y2...+YmY_1+Y_2...+Y_mY1​+Y2​...+Ym​

若这批矿产的检验结果与所给标准值 SSS 相差太多,就需要再去检验另一批矿产。小T不想费时间去检验另一批矿产,所以他想通过调整参数W 的值,让检验结果尽可能的靠近标准值 SSS ,即使得 S−YS-YS−Y 的绝对值最小。请你帮忙求出这个最小值。
输入输出格式
输入格式: 第一行包含三个整数 n,m,Sn,m,Sn,m,S ,分别表示矿石的个数、区间的个数和标准值。 接下来的 nnn 行,每行 个整数,中间用空格隔开,第 i+1i+1i+ 行表示 iii 号矿石的重量 wiw_iwi​ 和价值 viv_ivi​ 。 接下来的 mmm 行,表示区间,每行 个整数,中间用空格隔开,第 i+n+1i+n+1i+n+ 行表示区间 [Li,Ri][L_i,R_i][Li​,Ri​] 的两个端点 LiL_iLi​ 和 RiR_iRi​ 。注意:不同区间可能重合或相互重叠。 输出格式: 一个整数,表示所求的最小值。 输入输出样例
输入样例#: 复制 输出样例#: 复制 说明 【输入输出样例说明】 当 WWW 选 的时候,三个区间上检验值分别为 ,, , ,,, ,这批矿产的检验结果为 ,此时与标准值 SSS 相差最小为 。 【数据范围】 对于 %\% % 的数据,有 ≤n,m≤ ≤n ,m≤≤n,m≤ ; 对于 %\% % 的数据,有 ≤n,m≤ ≤n ,m≤≤n,m≤ ; 对于 %\% % 的数据,有 ≤n,m≤, ≤n ,m≤,≤n,m≤, ; 对于 %\%% 的数据,有 ≤n,m≤, ≤n ,m≤,≤n,m≤, ; 对于 %\%% 的数据,有 ≤n,m≤,,<wi,vi≤,<S≤,≤Li≤Ri≤n ≤n ,m≤,, < w_i,v_i≤^, < S≤^, ≤L_i ≤R_i ≤n1≤n,m≤,,<wi​,vi​≤,<S≤,≤Li​≤Ri​≤n 。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const long long INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
int ls[],rs[],n,m;
ll w[],v[];
ll s,pre_w[],pre_v[];
ll maxn = ,minn = INF,sum = ;
ll ans = ;
bool check(int x)
{
clean(pre_w);
clean(pre_v);
sum = ;
// cout<<x<<endl;
duke(i,,n)
{
if(w[i] >= x)
{
pre_w[i] ++;
pre_v[i] += v[i];
}
pre_w[i] += pre_w[i - ];
pre_v[i] += pre_v[i - ];
// printf("%lld %lld\n",pre_w[i],pre_v[i]);
}
ll f,tot = ;
duke(i,,m)
{
f = (pre_w[rs[i]] - pre_w[ls[i] - ]) * (pre_v[rs[i]] - pre_v[ls[i] - ]);
// cout<<f<<endl;
tot += f;
}
sum = abs(tot - s);
// cout<<sum<<endl;
if(tot >= s)
return true;
else
return false;
}
int main()
{
read(n);read(m);read(s);
duke(i,,n)
{
read(w[i]);read(v[i]);
minn = min(minn,w[i]);
maxn = max(maxn,w[i]);
}
duke(i,,m)
{
read(ls[i]);read(rs[i]);
}
int l = minn - ,r = maxn + ;
while(l <= r)
{
int mid = (l + r) / ;
if(check(mid) == true)
l = mid + ;
else
r = mid - ;
if(sum < ans)
ans = sum;
}
printf("%lld\n",ans);
return ;
}

P1314 聪明的质监员 二分答案的更多相关文章

  1. Luogu P1314 聪明的质监员 二分答案

    题目链接 Solution 这个范围不是二分就是结论题就是数学题... 然后再看一会差不多就可以看出来有单调性所以就可以确定二分的解法了 二分那个$W$,用前缀和$O(n+m)$的时间来求出对答案的贡 ...

  2. Luogu P1314 聪明的质监员(二分+前缀和)

    P1314 聪明的质监员 题意 题目描述 小\(T\)是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\) ...

  3. 洛谷 P1314 聪明的质监员 —— 二分

    题目:https://www.luogu.org/problemnew/show/P1314 显然就是二分那个标准: 当然不能每个区间从头到尾算答案,所以要先算出每个位置被算了几次: 不知为何自己第一 ...

  4. P1314 聪明的质监员(前缀和+二分)

    P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...

  5. 洛谷P1314 聪明的质监员

    P1314 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: ...

  6. luogu P1314 聪明的质监员 x

    P1314 聪明的质监员(至于为什么选择这个题目,可能是我觉得比较好玩呗) 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自 ...

  7. 洛谷P1314 聪明的质监员 题解

    题目 聪明的质监员 题解 这道题和之前Sabotage G的那道题类似,都是用二分答案求解(这道题还要简单一些,不需要用数学推导二分条件,只需简单判断一下即可). 同时为了降低复杂度,肯定不能用暴力求 ...

  8. 【luogu P1314 聪明的质监员】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1314 二分答案 但是计算区间贡献的时候 直接暴力会挂 前缀和加速 #include <cstdio&g ...

  9. P1314 聪明的质监员

    题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 \(w_i\)​ 以及价值 \(v_i\) .检验矿产的流程是 ...

随机推荐

  1. JS高级——静态成员与实例成员

    静态成员:构造函数的属性和方法 实例成员:实例化之后对象的属性和方法 // $("#id").css(); // $("#id").text(); // $.t ...

  2. Oracle Sequence不设置cache参数的几个潜在问题(转载)

    转载于 http://www.uml.org.cn/sjjm/201204065.asp 在Oracle中,我们没有MYSQL和SQL                           Server ...

  3. 关于Qt 报QDomDocument: No such file or directory错误解决办法

    肯定是没有找到相关的路径,这时候只需要在.pro文件中加入便好了,比如我要用到读写xml的一些头文件,则需要在.pro中加入如下代码: 就可以正常引用了.

  4. THREE.js代码备份——canvas - geometry - earth(球体贴纹理)

    <!DOCTYPE html> <html lang="en"> <head> <title>three.js canvas - g ...

  5. 获取qq音乐json数据---某课网音乐app学习

    移动端qq音乐地址:https://m.y.qq.com/ .抓取QQ音乐数据 请求首页时,有如下链接,回调了jsonp https://c.y.qq.com/splcloud/fcgi-bin/p. ...

  6. vC web管理无法访问解决办法

    localhost:~ # service-control --status vsphere-clientINFO:root:Service: vsphere-client, Action: stat ...

  7. 20190625 Oracle优化查询(一)

    与其惴惴不安,不如定心应变 前提:我的Oracle服务器是安装在Windows环境中的,没有上到Linux 查看表结构 查询全表 查找空值, 使用“=”是没有结果的,应该使用IS NULL

  8. CF176E Archaeology(set用法提示)

    题目大意: 给一棵树,每次激活或熄灭一个点,每次问这些点都联通起来所需的最小总边权 分析: 若根据dfs序给所有点排序,为$v1,v2,v3....vk$,那么答案就是$(dis(v1,v2)+dis ...

  9. php第十九节课

    JQUERY <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  10. JAVA经典题--计算一个字符串中每个字符出现的次数

    需求:  计算一个字符串中每个字符出现的次数 思路: 通过toCharArray()拿到一个字符数组--> 遍历数组,将数组元素作为key,数值1作为value存入map容器--> 如果k ...