博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【z05】聪明的质检员
阅读量:4322 次
发布时间:2019-06-06

本文共 1452 字,大约阅读时间需要 4 分钟。

这里写图片描述

这里写图片描述
这里写图片描述

【题目链接】:

【题解】

显然w越大,最后的Y也就越大;
可以依靠这个搞二分;
如果二分枚举的tw得到的Y比S小,则减小tw以增大Y,否则增大tw就好;
那个区间的和可以用前缀和搞出来(确定当前的tw然后搞前缀和);
枚举一下m个区间,每个区间都能O(1)搞出来则m个区间为O(m);然后前缀和搞一下是O(n);
然后二分w为O(logw);
总的复杂度为O(logw*(n+m));
完全可以接受了;
【完整代码】

#include 
#include
#define LL long longusing namespace std;const int MAXN = 2e5+100;const LL INF = 1e18;int sum[MAXN];LL w[MAXN],v[MAXN];LL sumv[MAXN];int n,m,query[MAXN][2];LL s,ans = INF;LL jue(LL x){ if (x>=0) return x; else return -x;}int main(){ //freopen("F:\\rush.txt","r",stdin); scanf("%d%d%I64d",&n,&m,&s); for (int i = 1;i <= n;i++) scanf("%I64d%I64d",&w[i],&v[i]); for (int i = 1;i <= m;i++) scanf("%d%d",&query[i][0],&query[i][1]); int l = 0,r = 1000000; while (l <= r) { int tw = (l+r)>>1; sum[0] = 0;sumv[0] = 0; for (int i = 1;i <= n;i++) if (w[i]>=tw) sum[i] = sum[i-1]+1,sumv[i] = sumv[i-1]+v[i]; else sum[i] = sum[i-1],sumv[i] = sumv[i-1]; LL temp = 0; for (int i = 1;i <= m;i++) { LL tem1 = sum[query[i][1]]-sum[query[i][0]-1]; LL tem2 = sumv[query[i][1]]-sumv[query[i][0]-1]; temp += tem1*tem2; } ans = min(ans,jue(temp-s)); if (temp >s) l = tw+1; else r = tw-1; } printf("%I64d\n",ans); return 0;}

转载于:https://www.cnblogs.com/AWCXV/p/7626973.html

你可能感兴趣的文章
Array.of使用实例
查看>>
【Luogu】P2498拯救小云公主(spfa)
查看>>
如何获取网站icon
查看>>
几种排序写法
查看>>
java 多线程的应用场景
查看>>
dell support
查看>>
转:Maven项目编译后classes文件中没有dao的xml文件以及没有resources中的配置文件的问题解决...
查看>>
MTK android 设置里 "关于手机" 信息参数修改
查看>>
单变量微积分笔记6——线性近似和二阶近似
查看>>
补几天前的读书笔记
查看>>
HDU 1829/POJ 2492 A Bug's Life
查看>>
CKplayer:视频推荐和分享插件设置
查看>>
CentOS系统将UTC时间修改为CST时间
查看>>
redis常见面试题
查看>>
导航控制器的出栈
查看>>
玩转CSS3,嗨翻WEB前端,CSS3伪类元素详解/深入浅出[原创][5+3时代]
查看>>
iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置
查看>>
Delphi消息小记
查看>>
JVM介绍
查看>>
将PHP数组输出为HTML表格
查看>>