题目大意

小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1
到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 vi。检验矿产的流程是:
1、给定 m 个区间[Li,Ri];
2、选出一个参数 W;
3、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值 Yi :
这批矿产的检验结果 Y 为各个区间的检验值之和。即:
$$\sum_j 1\times \sum_j v_j,j\in[L_i,R_i]且w_j\geq W,j时矿石编号$$
若这批矿产的检验结果与所给标准值 S 相差太多,就需要再去检验另一批矿产。小 T
不想费时间去检验另一批矿产,所以他想通过调整参数 W 的值,让检验结果尽可能的靠近
标准值 S,即使得 S-Y 的绝对值最小。请你帮忙求出这个最小值。

解题关键

要把所有满足$w_j\geq W$的$\sum_j, \sum_j v_j$,一定要记得前缀和优化!这样就可以$O(n\log n)$解决,而不是$O(n^2\log n$了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std; #define UpdMax(x, y) x = max(x, y)
#define ll long long
const int MAX_N = 200010, MAX_Q = 200010;
const ll INF64 = 0x3f3f3f3f3f3f3f3fll;
ll W[MAX_N], V[MAX_N];
int L[MAX_N], R[MAX_N];
int N, TotQ;
ll Y, StdY; ll GetY(ll w)
{
static ll SumV[MAX_N];
static int SumCnt[MAX_N];
memset(SumV, 0, sizeof(SumV));
memset(SumCnt, 0, sizeof(SumCnt));
for (int i = 1; i <= N; i++)
{
SumV[i] = SumV[i - 1] + V[i] * (W[i] >= w);
SumCnt[i] = SumCnt[i - 1] + (W[i] >= w);
}
ll y = 0;
for (int q = 1; q <= TotQ; q++)
{
ll cnt = SumCnt[R[q]] - SumCnt[L[q] - 1], vSum = SumV[R[q]] - SumV[L[q] - 1];
y += cnt * vSum;
}
return Y = y;
} bool LeStdY(ll w)
{
return GetY(w) <= StdY;
} bool GeStdY(ll w)
{
return GetY(w) >= StdY;
} ll LowerBound(ll l, ll r, bool (*InUpperRange)(ll))
{
if (!InUpperRange(r))
return -1;
while (l < r)
{
ll mid = (l + r) / 2;
if (InUpperRange(mid))
r = mid;
else
l = mid + 1;
}
InUpperRange(l);
return l;
} ll UpperBoundSubtract1(ll l, ll r, bool (*InLowerRange)(ll))
{
if (!InLowerRange(l))
return -1;
while (l < r)
{
ll mid = (l + r + 1) / 2;
if (InLowerRange(mid))
l = mid;
else
r = mid - 1;
}
InLowerRange(l);
return l;
} int main()
{
scanf("%d%d%lld", &N, &TotQ, &StdY);
ll MaxW = 0;
for (int i = 1; i <= N; i++)
scanf("%lld%lld", W + i, V + i);
for (int i = 1; i <= N; i++)
UpdMax(MaxW, W[i]);
for (int i = 1; i <= TotQ; i++)
scanf("%d%d", L + i, R + i);
Y = INF64;
LowerBound(1, MaxW, LeStdY);
ll y1 = Y;
Y = INF64;
UpperBoundSubtract1(1, MaxW, GeStdY);
ll y2 = Y;
printf("%lld\n", min(abs(y1 - StdY), abs(y2 - StdY)));
return 0;
}

  

luogu1314 聪明的质检员的更多相关文章

  1. Luogu 1314 【NOIP2011】聪明的质检员 (二分)

    Luogu 1314 [NOIP2011]聪明的质检员 (二分) Description 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从 1 到n逐一编号,每个矿石都有 ...

  2. [NOIP 2011] 聪明的质检员

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

  3. [NOIP2011] 聪明的质检员(二分答案)

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

  4. NOIP2015聪明的质检员[二分 | 预处理]

    背景 NOIP2011 day2 第二题 描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每个矿石都有自己的重量 wi 以及价值vi .检验矿 ...

  5. Vijos P1740聪明的质检员

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

  6. 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)

    ###一道二分答案加前缀和### 题目中已经暗示的很明显了 "尽可能靠近" " 最小值" 本题的主要坑点在于 long long 的使用 ##abs函数不支持l ...

  7. luogu 1314 聪明的质检员

    二分答案的边界问题还是要注意 double挨着,int+1-1, 此题用到long long,所以初始化ans要足够大,前缀和优化 依然根据check答案大小左右mid,虽然有s,但是有了+1-1加持 ...

  8. [NOIP2011]聪明的质检员

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

  9. vijos P1740 聪明的质检员

    题目链接:传送门 题目大意:给你n个物品,每件物品有重量 W 和价值 V,给m个区间,和一个标准值.(n,m最大200000) 要求找到一个值x,使得m个所有区间的权值和与标准值的差的绝对值最小.单个 ...

随机推荐

  1. JAVA基础——设计模式之简单工厂模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...

  2. 笔试算法题(47):简介 - B树 & B+树 & B*树

    B树(B-Tree) 1970年由R. Bayer和E. Mccreight提出的一种适用于外查找的树,一种由BST推广到多叉查找的平衡查找树,由于磁盘的操作速度远小于存储器的读写速度,所以要求在尽量 ...

  3. 笔试算法题(42):线段树(区间树,Interval Tree)

    议题:线段树(Interval Tree) 分析: 线段树是一种二叉搜索树,将一个大区间划分成单元区间,每个单元区间对应一个叶子节点:内部节点对应部分区间,如对于一个内部节点[a, b]而言,其左子节 ...

  4. Not so Mobile (针对递归输入的函数)

      Before being an ubiquous communications gadget, a mobile was just a structure made of strings and ...

  5. Overload重載和Override重写的区别。Overloaded的方法是否可以改变返回值的类型?

    Overload是重载的意思,Override是覆盖的意思,也就是重写. 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同). 重写Ove ...

  6. MySQL SQL语句 生成32位 UUID

    在运营中,有时会碰到线下下单,线下注册,需要在数据库对其数据批量生成导入的场景. 此时如果你的数据表主键并不是Int整型自动递增而是32位的UUID这种情况该怎么办呢? MySQL 其实实现了UUID ...

  7. windows 下 iptables

    windows自带的防火墙就可以. 在命令行方式下输入netsh回车,再输入firewall回车,之后想干什么就干什么. 头一次见对图形化防火墙头晕的...

  8. multi cookie & read bug

    js cookie multi cookie & read bug document.cookie; // "access_token_test=eyJhbGciOiJIUzI1Ni ...

  9. hdu 5093 二分匹配

    /* 题意:给你一些冰岛.公共海域和浮冰,冰岛可以隔开两个公共海域,浮冰无影响 求选尽可能多的选一些公共海域点每行每列仅能选一个. 限制条件:冰山可以隔开这个限制条件.即*#*可以选两个 预处理: * ...

  10. bzoj 3173 [Tjoi2013]最长上升子序列 (treap模拟+lis)

    [Tjoi2013]最长上升子序列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2213  Solved: 1119[Submit][Status] ...