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

题干:

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

    1.只在函数中使用 2.返回的是实参的数组 <script> getNum(1, 2);//(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ ...

  2. Android studio在使用过程中的问题总汇!

    使用android studio也有一段时间了,汇总了一下这段时间内遇到一些常见问题,希望能够帮助到大家! 一.字体大小问题 在android studio的使用过程中没有发现类似于Eclipse中的 ...

  3. [Windows Server 2003] 还原SQL Server数据库

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:SQL Ser ...

  4. TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具

    怀着鸡动的心情跟大家介绍一款国产开源运维软件TriAquae,轻松帮你搞定大部分运维工作!TriAquae 是一款由国产的基于Python开发的开源批量部署管理工具,可以允许用户通过一台控制端管理上千 ...

  5. Codeforces_718A

    A. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...

  6. day07补充-数据类型总结及拷贝

    目录 数据类型总结 按照存一个值 OR 多个值来分 按照有序 OR 无序来分 按照可变 OR 不可变来分 拷贝 && 浅拷贝 && 深拷贝&& .cop ...

  7. JS DOM节点(当前标签和同级、父级、子级..之间的关系)

    1. 通过顶层document节点获取    1) document.getElementById(elementId) //根据id获得    2) document.getElementsByNa ...

  8. [API 开发管理] EOLINKER 升级为多产品架构, AMS V4.5 版本常见问题汇总

    自AMS4.5开始,eoLinker 全面升级为多产品架构,部分操作方式较以前有较大改变,本文针对改进部分做重点说明. 在说明之前,我们先通过以下的图文看看AMSV4.5更新了哪些内容: Q:我可以创 ...

  9. 基于Arduino的音乐动感节奏灯

    1.音乐动感节奏灯是个什么东西? 前段时间听音乐觉得无聊,便想着音乐光听也没意思啊,能不能 “看见” 音乐呢?于是谷歌了一番,发现还真有人做了将音乐可视化的东西,那就是音乐节奏灯.说的简单点就是LED ...

  10. 00106_UDP通信

    1.DatagramPacket (1)JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据: (2)在创建发送端和接收端的Dat ...