聪明的质检员

来源:互联网 发布:网络空间安全专业待遇 编辑:程序博客网 时间:2024/04/23 23:50

二分+前缀和优化,不优化就是o(nmlogn)了
对参数w进行二分答案,通过w对y进行计算,如果找大了,就说明参数w找小了,答案在mid右面,找小了反之。

#include<cstdio> #include<iostream>#include<cstring>#define LL long longusing namespace std;LL sum[299999],cnt[299999];int n,m;LL s;LL minn=99999999999;int ll[299999],rr[299999],w[299999],v[299999];LL checkw(int x){    LL ans=0;    memset(sum,0,sizeof(sum));    memset(cnt,0,sizeof(cnt));    for(int i=1;i<=n;i++)    if(w[i]>=x) {        sum[i]=sum[i-1]+v[i];        cnt[i]=cnt[i-1]+1;    }    else cnt[i]=cnt[i-1],sum[i]=sum[i-1];//前缀和    for(int i=1;i<=m;i++)    {        ans+=(sum[rr[i]]-sum[ll[i]-1])*(cnt[rr[i]]-cnt[ll[i]-1]);//算y    }    minn=min(minn,((s-ans)>=0)?(s-ans):(ans-s));//找最优解    return ans;}int main(){    scanf("%d%d%lld",&n,&m,&s);    int l=1,r;    for(int i=1;i<=n;i++)    {        scanf("%d%d",&w[i],&v[i]);         r=max(r,w[i]);//找r的最大限度    }    r+=5;//防止二分出错    for(int i=1;i<=m;i++)    scanf("%d%d",&ll[i],&rr[i]);    while(l<=r)    {        int mid=(r+l)>>1;        LL y=checkw(mid);        if(y>s) l=mid+1;        else if(y<s) r=mid-1;        else {printf("0");return 0;}    }//二分答案    printf("%lld",minn);    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 姓名学里人格不好怎么办 买家订单下不了怎么办 公积金不够月供怎么办 房贷担保费没交怎么办 营业执照过期1年怎么办 营业执照和公章丢失怎么办 个体户怎么办对公账户 公章法人章丢失怎么办 广州买房没有社保怎么办 辞职后计生关系怎么办 广州换工作社保怎么办 学校更名了盖章怎么办 工商注册资金没有交怎么办 住公司宿舍怎么办居住证 住在公司宿舍怎么办居住证 滴滴没有的车型怎么办 假的租房合同怎么办 代注册公司被骗怎么办 公司跨区迁址怎么办 公司搬走注册地怎么办 注册公司没有房产证怎么办 公司不运营了怎么办 公司注销了账户怎么办 租户不变更地址怎么办 营业执照忘审了怎么办 工商营业执照年检过期怎么办 个体营业执照没有年报怎么办? 个体工商户一年没有申报怎么办 个体工商户逾期未申报怎么办 个体户没报税过怎么办 农业银行证书过期了怎么办 ca证书丢了怎么办 ca证书被锁怎么办 上个月忘记清卡怎么办 财务人员进入税务黑名单怎么办 社保本丢了怎么办 贷款车辆登记证书怎么办 发票薄丢了怎么办? 汽车发票丢了怎么办 税票弄丢了怎么办 交强险正本丢了怎么办