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\) .检验矿产的流程是 ...
随机推荐
- Angular——事件指令
基本介绍 angular的事件指令都是ng-click,ng-blur....的形式,类似于js的事件 基本使用 <!DOCTYPE html> <html lang="e ...
- SQL基本操作——表的创建
通过代码方式创建数据库 create database MyDatabaseNew on primary ( --名字 name='MyDatabaseNew_data', --路径 filename ...
- kickstart配置文件详解和system-config-kickstart (转载)
kickstart是什么 许多系统管理员宁愿使用自动化的安装方法来安装红帽企业 Linux.为了满足这种需要,红帽创建了kickstart安装方法.使用kickstart,系统管理员可以 ...
- 基于zk“临时顺序节点“的分布式锁
import org.apache.zookeeper.*; import org.apache.zookeeper.data.Stat; import java.io.IOException; im ...
- PHP 之中文转为拼音
/** * Created by PhpStorm. * User: Administrator * Date: 2019/1/2 0002 * Time: 下午 1:01 */ class PinY ...
- ubuntu14.04远程软件VNC的安装、设置方法
ubuntu中VNCX11開機啟動保持靜默狀態方法: 1首先安裝vncx11. 2.設置vnc密碼,會自動保存在/home/test/.vnc/passwd中 3.將密碼複製到/etc中 4.在/et ...
- 【上海站】EOLINKER 用户培训之旅,等你来共建API新连接
从今年3月4日起,EOLINKER AMS 团队将再次开启全国用户培训之旅.本次全国培训之旅依旧将覆盖北上广深等国内主要城市,重点提供两种服务内容,一是 对 EOLINKER 产品的交流,包括 API ...
- oralce 创建表空间 和 查询进程
-- Create the user create user lesdba identified by les_321 default tablespace USERS temporary table ...
- Linux之iptables(三、命令--->单主机)
iptables命令规则格式: iptables [-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname ...
- vs2015 配置 cplex
首先设置模式为Release, 根据软件选择x86或x64 附加库目录(链接器 - 常规) C:\Program Files\IBM\ILOG\CPLEX_Studio128\cplex\lib\x6 ...