P1314 聪明的质监员 二分答案
这个题我第一反应是线段树(雾),然后看了一眼题解之后就后悔了。。。前缀和。。。然后二分答案,然后就没有然后了。
题干:
小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 聪明的质监员 二分答案的更多相关文章
- Luogu P1314 聪明的质监员 二分答案
题目链接 Solution 这个范围不是二分就是结论题就是数学题... 然后再看一会差不多就可以看出来有单调性所以就可以确定二分的解法了 二分那个$W$,用前缀和$O(n+m)$的时间来求出对答案的贡 ...
- Luogu P1314 聪明的质监员(二分+前缀和)
P1314 聪明的质监员 题意 题目描述 小\(T\)是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\) ...
- 洛谷 P1314 聪明的质监员 —— 二分
题目:https://www.luogu.org/problemnew/show/P1314 显然就是二分那个标准: 当然不能每个区间从头到尾算答案,所以要先算出每个位置被算了几次: 不知为何自己第一 ...
- P1314 聪明的质监员(前缀和+二分)
P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...
- 洛谷P1314 聪明的质监员
P1314 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿产的流程是: ...
- luogu P1314 聪明的质监员 x
P1314 聪明的质监员(至于为什么选择这个题目,可能是我觉得比较好玩呗) 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自 ...
- 洛谷P1314 聪明的质监员 题解
题目 聪明的质监员 题解 这道题和之前Sabotage G的那道题类似,都是用二分答案求解(这道题还要简单一些,不需要用数学推导二分条件,只需简单判断一下即可). 同时为了降低复杂度,肯定不能用暴力求 ...
- 【luogu P1314 聪明的质监员】 题解
题目链接:https://www.luogu.org/problemnew/show/P1314 二分答案 但是计算区间贡献的时候 直接暴力会挂 前缀和加速 #include <cstdio&g ...
- P1314 聪明的质监员
题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 \(w_i\) 以及价值 \(v_i\) .检验矿产的流程是 ...
随机推荐
- HTTP05--HTML常用知识
一.URL地址含义 需要搞清URL和URI的差别,以及QueryString的含义. 二.GET和POST的区别 详细介绍可参考文章:http://zengrong.net/post/1802.htm ...
- JS——scroll封装
DTD未声明:document.body.scrollTop DTD已声明:document.documentElement.scrollTop 火狐谷歌IE9:window.pageYOffset ...
- [Windows Server 2012] Apache+PHP安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...
- TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具
怀着鸡动的心情跟大家介绍一款国产开源运维软件TriAquae,轻松帮你搞定大部分运维工作!TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具,可以允许用户通过一台控制端管理上千 ...
- ProE常用曲线方程:Python Matplotlib 版本代码(蝴蝶曲线)
花纹的生成可以使用贴图的方式,同样也可以使用方程,本文列出了几种常用曲线的方程式,以取代贴图方式完成特定花纹的生成. 注意极坐标的使用................. 前面部分基础资料,参考:Pyt ...
- transition-分栏按钮动画
=> css: .cateBtn{ position: relative; background: #fff; border: 1px solid #ddd; border-radius: ...
- windons共享的一些问题
有时候访问共享一直说无法打开共享,但是别人确实是开了共享. 其中可能如下: 1.首先确定网络没有问题,win+R输入cmd,ping对方IP地址,保证是网络是通的,如果不通,关闭共享电脑的防火墙. 2 ...
- NOIWC2019 冬眠记
冬眠 由于THUWC考太差了没啥心情做事…… Day -1 报到日前一天晚上去看了看宿舍表,发现周围全是集训队,隔壁就是栋爷.高队和lca,再隔壁是zzq和wxh……吓傻了(本校buff这么好吗) D ...
- is_NaN的使用
原生js中使用判断某个值是否是数值,有且只有一个方法就是is_NaN. 原理:这个函数使用了Number() 去转换需要判断的值.Number() 去转换值,如果有任意非数值字符存在则就不是一个数值. ...
- Luogu P2068 统计和
P2068 统计和 题目描述 给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=1000 ...