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

题干:

小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——event

    触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息: 普通浏览器支持 event(传参),IE678支持 window.event(无参),兼容写法: < ...

  2. python编辑csv

    import csv import time def timestamp_to_timestr(timeStamp): timeArray = time.localtime(int(timeStamp ...

  3. Centos6.7 编译安装 MySQL教程

    Centos6.7 编译安装 MySQL # 安装依赖包 [root@localhost ~]# yum -y install gcc gcc-c++ autoconf* automake* zlib ...

  4. sql日期提取

    --插入数据修改不行:必须提供学号 insert into Student(生日类型) values('阳历') --把月份提取出来 显示两位数 select DATENAME(month,getda ...

  5. CAD绘制一个线型标注(com接口VB语言)

    主要用到函数说明: _DMxDrawX::DrawDimRotated 绘制一个线型标注.详细说明如下: 参数 说明 DOUBLE dExtLine1PointX 输入第一条界线的起始点X值 DOUB ...

  6. Fiddler构造请求

    Fiddler工具是一个http协议调试代理工具,它可以帮助程序员测试或调试程序,辅助web开发. Fiddler工具可以发送向服务端发送特定的HTTP请求以及接受服务器回应的请求和数据,是web调试 ...

  7. Python学习【第6篇】:Python之常用模块1

    常用模块一. collocations 模块 时间模块 random模块 os模块 sys模块 序列化模块 re模块 常用模块二:这些模块和面向对象有关 hashlib模块 configparse模块 ...

  8. Flask - 路由系统

    目录 Flask - 路由系统 @app.route()装饰器中的常用参数 methods : 当前 url 地址,允许访问的请求方式 endpoint:反向url地址,默认为视图函数名(url_fo ...

  9. 第十二节:pandas缺失数据处理

    1.isnull():检查是否含有确实数据 2.fillna():填充缺失数据 3.dropna() :删除缺失值 4.replace():替换值

  10. Xen、OpenVZ、KVM、Hyper-V、VMWare虚拟化技术介绍

    一.Xen 官网:http://xen.org/ Xen 由剑桥大学开发,它是基于硬件的完全分割,物理上有多少的资源就只能分配多少资源,因此很难超售.可分为Xen-PV(半虚拟化),和Xen-HVM( ...