2.聪明的质监员(qc.cpp/c/pas) 
【问题描述】 
小 T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n 个矿石,从 1
到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 vi。检验矿产的流程是: 
1、给定 m个区间[Li,Ri]; 
2、选出一个参数 W; 
3、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值 Yi  : 
 j∈[Li ,Ri ]且wj ≥W ,j 是矿石编号 

这批矿产的检验结果 Y为各个区间的检验值之和。即:  

若这批矿产的检验结果与所给标准值 S 相差太多,就需要再去检验另一批矿产。小 T
不想费时间去检验另一批矿产,所以他想通过调整参数 W 的值,让检验结果尽可能的靠近
标准值 S,即使得 S-Y的绝对值最小。请你帮忙求出这个最小值。 

【输入】 
输入文件 qc.in。 
第一行包含三个整数 n,m,S,分别表示矿石的个数、区间的个数和标准值。 
接下来的 n行,每行 2个整数,中间用空格隔开,第 i+1 行表示 i 号矿石的重量 wi 和价
值 vi  。 
接下来的 m行,表示区间,每行 2个整数,中间用空格隔开,第 i+n+1 行表示区间[Li, 
Ri]的两个端点 Li 和 Ri。注意:不同区间可能重合或相互重叠。 
【输出】 
输出文件名为 qc.out。 
输出只有一行,包含一个整数,表示所求的最小值。 

【输入输出样例】 
qc.in 
5 3 15  
1 5   
2 5 
3 5 
4 5 
5 5 
1 5 
2 4 
3 3 
qc.out 
10 

【输入输出样例说明】 
当 W 选 4 的时候,三个区间上检验值分别为 20、5、0,这批矿产的检验结果为 25,此
时与标准值 S相差最小为 10。 
【数据范围】 
对于 10%的数据,有 1≤n,m≤10; 
对于 30%的数据,有 1≤n,m≤500; 
对于 50%的数据,有 1≤n,m≤5,000; 
对于 70%的数据,有 1≤n,m≤10,000; 
对于 100%的数据,有 1≤n,m≤200,000,0<wi, vi≤10^6,0<S≤10^12,1≤Li≤Ri≤n。

题解:很容易发现W越大,Y越小,具有单调性,可以用二分来计算;

这里求区间内的大于W的个数乘wj大于W的石头的v的和的积,这玩意是可以用前缀和优化的;

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<map>
#include<set>
#include<vector>
#include<ctime>
#include<cmath>
#define LL long long
using namespace std;
#define LL long long
#define up(i,j,n) for(int i=(j);(i)<=(n);(i)++)
#define max(x,y) ((x)<(y)?(y):(x))
#define min(x,y) ((x)<(y)?(x):(y))
#define FILE "1"
namespace OI{
const int maxn=;
const LL inf=1000000000000000000LL;
int w[maxn],v[maxn],q[maxn];
LL ws[maxn],vs[maxn],S;
int n,m,cnt=;
int b[maxn][];
void init(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%d%d%I64d",&n,&m,&S);
up(i,,n)scanf("%d%d",&w[i],&v[i]);
up(i,,m)scanf("%d%d",&b[i][],&b[i][]);
up(i,,n)q[++cnt]=w[i];q[++cnt]=;
sort(q+,q+cnt+);
}
LL ans=inf;
bool get(int mid){
memset(vs,,sizeof vs);
memset(ws,,sizeof ws);
up(i,,n){
vs[i]=vs[i-];ws[i]=ws[i-];
if(w[i]>=q[mid])vs[i]+=v[i],ws[i]+=;
}
LL Y=;
up(i,,m){
Y+=(ws[b[i][]]-ws[b[i][]-])*(vs[b[i][]]-vs[b[i][]-]);
if(Y<)return ;//有可能爆LL,爆掉时,很显然不可能是最优解,直接退出即可;
}
if(abs(Y-S)<=ans)ans=abs(Y-S);
return Y>=S;
}
void slove(){
init();
int left=,right=cnt,mid;
while(left+<right){
mid=(left+right)>>;
if(get(mid))left=mid;
else right=mid;
}
get(left);get(right);
cout<<ans<<endl;
}
} int main(){
using namespace OI;
slove();
}

[NOIP2011提高组day2]-2-聪明的质监员的更多相关文章

  1. 水题挑战2 :NOIP提高组 2011 聪明的质监员

    小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从\(1\) 到 \(n\) 逐一编号,每个矿石都有自己的重量 \(w_i\) 以及价值 \(v_i\) .检验矿 ...

  2. NOIP2011 提高组 Day2

    自测时间:2017.4.12 8:15——11:45 实际得分:100+0+0=100 期望得分:100+100+0=260 T2 符合要求的总价值*符合要求的总个数 写成:符合要求的总价值*区间总个 ...

  3. [NOIP2011提高组day2]-3-观光公交

    3.观光公交 (bus.cpp/c/pas) [问题描述] 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光 ...

  4. [NOIP2011提高组day2]-1-计算系数

    1.计算系数 (factor.cpp/c/pas) [问题描述] k n m给定一个多项式(ax+by)^k ,请求出多项式展开后(x^n)*(y^m)项的系数. [输入] 输入文件名为 factor ...

  5. Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数

    Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...

  6. [NOIP2011] 提高组 洛谷P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  7. NOIP2011(提高组)DAY2---观光公交(vijosP1741)

    描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4……n号景 ...

  8. 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交

    P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...

  9. [Luogu1313][NOIP2011提高组]计算系数

    题目描述 给定一个多项式 (by+ax)k(by+ax)^k(by+ax)k ,请求出多项式展开后 xn×ymx^n \times y^mxn×ym 项的系数. 输入输出格式 输入格式: 共一行,包含 ...

随机推荐

  1. es6 repeat() 原字符串重复

    repeat()返回一个新字符串,表示将原字符串重复n次. var str = "x"; str.repeat(3) // "xxx" var str1 = & ...

  2. [Machine Learning with Python] How to get your data?

    Using Pandas Library The simplest way is to read data from .csv files and store it as a data frame o ...

  3. Oracle中PL/SQL 范例

    1.写匿名块,输入三角形三个表的长度.在控制台打印三角形的面积 declare v_side_first ):=&第一条边; v_side_second ):=&第二条边; v_sid ...

  4. Spring Boot中实现异步调用之@Async

    一.什么是异步调用 “异步调用”对应的是“同步调用”,同步调用指程序按照定义顺序依次执行,每一行程序都必须等待上一行程序执行完成之后才能执行:异步调用指程序在顺序执行时,不等待异步调用 的语句返回结果 ...

  5. win7 32位配置apache+wsgi+django环境

    1下载xampp,里面有apache,mysql,phpmyadmin, 2 下载wsgi,http://download.csdn.net/download/copter/9192361 将对应的模 ...

  6. Redis及其Sentinel配置项详细说明

    Redis及其Sentinel配置项详细说明 http://lixiaohui.iteye.com/blog/2315516

  7. git pull出现fatal: unable to access 'https://github.com/XXX/YYY.git'

    用cmd 发现ping不同 github.com Ping不通,这时候,只需要在host文件里做些修改就可以,首先,定位到路径 C:\Windows\System32\drivers\etc 找到ho ...

  8. hdu5379||2015多校联合第7场1011 树形统计

    pid=5379">http://acm.hdu.edu.cn/showproblem.php? pid=5379 Problem Description Little sun is ...

  9. PHP_EOL是什么意思?

      PHP_EOL 代表php的换行符, 这个变量会根据平台而变, 在windows下会是/r/n, 在linux下是/n, 在mac下是/r             文章来源:刘俊涛的博客 地址:h ...

  10. Balanced Binary Tree——数是否是平衡,即任意节点左右字数高度差不超过1

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...