考试的时候打的二分但没有用前缀和维护。但是有个小细节手误打错了结果挂掉了。

绝对值的话可能会想到三分,但是注意到w增大的时候y是减小的,所以单调性很明显,用二分就可以。但注意一个问题,就是二分最后的结果不一定是最优的,只是在它属于的符号里是最优的,所以需要最后存正负的最优解去比较。

至于check(),先把所有满足wi>=W的所有条件的num(个数)和v(权值)在本位置加上,求前缀和。

即∑vi(wi>=W);∑num(wi>=W)。最后用区间的话用前缀和相减维护即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define pos(i,a,b) for(long long i=(a);i<=(b);i++)
#define N 410000
long long n,m,s;
long long w[N],v[N];
struct haha{
    long long left,right;
}cun[N];
long long ma;
long long l,r,ans;
long long aabs(long long x){
    return x<0?(-x):x;
}
long long temp,ans1=0x7fffffffffffffffLL,ans2=0x7fffffffffffffffLL;
long long pren[N],prevv[N];
long long check(long long x){
    temp=0;
    pos(i,1,n){
        pren[i]=pren[i-1]+(w[i]>=x);
        if(w[i]>=x){
            prevv[i]=prevv[i-1]+v[i];
        }
        else{
            prevv[i]=prevv[i-1];
        }
    }
    pos(i,1,m){
        temp+=(pren[cun[i].right]-pren[cun[i].left-1])*(prevv[cun[i].right]-prevv[cun[i].left-1]);
    }
    if(temp-s>0){
        ans1=ans1>temp-s?temp-s:ans1;
        return 1;
    }
    if(temp-s==0){
        printf("0");
        return 2;
    }
    if(temp-s<0){
        ans2=ans2>s-temp?s-temp:ans2;
        return 0;
    }
}
int main(){
    //freopen("qc.in","r",stdin);
    //freopen("qc.out","w",stdout);
    scanf("%lld%lld%lld",&n,&m,&s);
    pos(i,1,n){
        scanf("%lld%lld",&w[i],&v[i]);
        ma=max(w[i],ma);
    }
    pos(i,1,m){
        scanf("%lld%lld",&cun[i].left,&cun[i].right);
    }
    l=0,r=ma;
    while(l<=r){
        long long mid=(l+r)>>1;
        //cout<<"mid="<<mid<<"  l="<<l<<"  r="<<r<<endl;system("pause");
        long long qian=check(mid);
        if(qian==1)
            l=mid+1;
        if(qian==2)
            return 0;
        if(qian==0)
            r=mid-1;
    }
    long long ans=ans1>ans2?ans2:ans1;
    cout<<ans;
    return 0;
}

  

[NOIP2011] 聪明的质监员 二分+前缀和的更多相关文章

  1. Luogu P1314 聪明的质监员(二分+前缀和)

    P1314 聪明的质监员 题意 题目描述 小\(T\)是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\) ...

  2. NOIP2011聪明的质监员题解

    631. [NOIP2011] 聪明的质监员 ★★   输入文件:qc.in   输出文件:qc.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 小 T 是一名质量监督 ...

  3. NC16597 [NOIP2011]聪明的质监员

    NC16597 [NOIP2011]聪明的质监员 题目 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿 ...

  4. P1314 聪明的质监员(前缀和+二分)

    P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...

  5. 【洛谷P1314】[NOIP2011]聪明的质监员

    聪明的质监员 题目链接:https://www.luogu.org/problemnew/show/P1314 Y(W)随W的值增大而减小 二分W的值,找到最小的W使得Y(W)>S: 比较Y(W ...

  6. $Noip2011/Luogu1314$ 聪明的质监员 二分+巧妙前缀和

    $Luogu$ $Sol$ 首先$W$一定是某个$w_i$.于是一种暴力方法就出炉了,枚举$W$再计算. 注意到,满足$S-Y$的绝对值最小的$Y$只可能是两种,一种是$<S$的最大的$Y$,一 ...

  7. [NOIP2011]聪明的质监员 题解

    题目大意: 额--貌似蛮清晰的,就不赘述了. 思路: 首先不难发现M越大Y越小,因此可以二分答案(方向不要弄错),二分出最小的不小于S的Y即可.而计算Y时可用前缀和O(n+m)求得.两种边界情况也要考 ...

  8. Luogu P1314 聪明的质监员 二分答案

    题目链接 Solution 这个范围不是二分就是结论题就是数学题... 然后再看一会差不多就可以看出来有单调性所以就可以确定二分的解法了 二分那个$W$,用前缀和$O(n+m)$的时间来求出对答案的贡 ...

  9. Luogu 1314 [NOIP2011] 聪明的质监员

    二分答案 + 前缀和. 题面中式子的意思是每一个区间$[l, r]$的贡献是这个区间内$w_i \geq W$的个数乘以这些$i$的$v_i$和. 很快发现了答案具有单调性,可以做两遍二分,分别看看小 ...

随机推荐

  1. 矩阵的f范数及其求偏导法则

    转载自: http://blog.csdn.net/txwh0820/article/details/46392293 矩阵的迹求导法则   1. 复杂矩阵问题求导方法:可以从小到大,从scalar到 ...

  2. 微信支付(APP)

    折腾了一天,终于搞定了微信支付,总结一下.首先从服务器端获取prepareid,Andorid 端再根据这个prepareid二次签名. 服务器端: 从官网上下载DEMO,Demo中只有JsAPi,M ...

  3. 【PHP】制作日历

    本期本博主将讲述两种利用PHP制作日历的方法,由于PHP日期函数的便捷性,使得我们制作日历这一过程变得相当简单 问题描述: 1.取到当前日期,并着色显示:2.根据当前日期,判断本月有多少天,一号是周几 ...

  4. JavaScript学习笔记(散)——继承、构造函数super

    构造函数中的super 今天看<JavaScript设计模式与开发实践>时,在书中看到一段代码出现super语句,第一次看到这个关键字,所以上网查了下它的作用,发现这个关键字是来自java ...

  5. MySQL(三)--函数与谓词

    前文已有涉及,这里作为总结重新整理一下. 一.函数 1.算术函数 NUMERIC 是大多数 DBMS 都支持的一种数据类型,通过 NUMBERIC ( 全体位数, 小数位数 ) 的形式来指定数值的大小 ...

  6. 浅谈angular中的promise

    promise目的就是为了跳出回调地狱.老掉牙的东西,大神轻拍. 举个最简单的例子:请求数据(getData),解析数据(executeData),显示数据(showData). //获取数据 fun ...

  7. git常用基本命令

    一定要以管理员的身份打开,否则有些命令不能用,比如ssh -T git@github.com(查看配置ssh是否成功)@初始化git git config --global user.name ruo ...

  8. java后端程序员1年工作经验总结

    java后端1年经验和技术总结(1) 1.引言 毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西.这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为 ...

  9. vue.js 组件之间传递数据

    前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.如何传递数据也成了组件的重要知识点之一. 组件 组件与组件之间,还存在着不同的关 ...

  10. vim中常用基本命令

    一般模式可用命令,含光标移动.复制粘贴.查找替换等功能 Ctrl+f:屏幕向下移动一页,相当Page Down按钮 Ctrl+b:屏幕向上移动一页,相当Page Up按钮 0或Home键:移动到行首 ...