题目:https://www.luogu.org/problemnew/show/P1314

显然就是二分那个标准;

当然不能每个区间从头到尾算答案,所以要先算出每个位置被算了几次;

不知为何自己第一想法是把符合要求的位置插入树状数组再遍历区间得到该区间内的个数然后在其左右端点差分最后遍历位置时一边计算每个位置的次数;

但其实用前缀和就可以了...而且前缀和比上面那个快好多...

调了好半天,才发现 ans 的初值不能习惯性地赋成 0x3f3f3f3f,那个才是个 int 范围内的...

代码如下:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define mid ((L+R)>>1)
  6. using namespace std;
  7. typedef long long ll;
  8. int const maxn=2e5+;
  9. int n,m,mx,w[maxn],v[maxn],f[maxn],l[maxn],r[maxn],d[maxn],num[maxn];
  10. ll ans,s,sum[maxn];
  11. ll rd()
  12. {
  13. ll ret=,f=; char ch=getchar();
  14. while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
  15. while(ch>=''&&ch<='')ret=(ret<<3ll)+(ret<<1ll)+ch-'',ch=getchar();
  16. return f?ret:-ret;
  17. }
  18. void add(int x){for(;x<=n;x+=(x&-x))f[x]++;}
  19. int query(int x){int ret=; for(;x;x-=(x&-x))ret+=f[x]; return ret;}
  20. ll work(int x)
  21. {
  22. ll ret=;
  23. // memset(f,0,sizeof f);
  24. // memset(d,0,sizeof d);
  25. // for(int i=1;i<=n;i++)if(w[i]>=x)add(i);
  26. // for(int i=1;i<=m;i++)
  27. // {
  28. // int k=query(r[i])-query(l[i]-1);
  29. // printf("l=%d r=%d k=%d\n",l[i],r[i],k);
  30. // d[l[i]]+=k; d[r[i]+1]-=k;
  31. // }
  32. // for(int i=1,nw=0;i<=n;i++)
  33. // {
  34. // nw+=d[i];
  35. // if(w[i]>=x)ret+=(ll)v[i]*nw;
  36. // printf("i=%d ret=%lld\n",i,ret);
  37. // }
  38. memset(sum,,sizeof sum);
  39. memset(num,,sizeof num);
  40. for(int i=;i<=n;i++)
  41. {
  42. num[i]=num[i-]+(w[i]>=x);
  43. sum[i]=sum[i-]+(w[i]>=x?v[i]:);
  44. // printf("num[%d]=%d sum[%d]=%d\n",i,num[i],i,sum[i]);
  45. }
  46. for(int i=;i<=m;i++)
  47. ret+=(sum[r[i]]-sum[l[i]-])*(num[r[i]]-num[l[i]-]);
  48. return ret;
  49. }
  50. int main()
  51. {
  52. n=rd(); m=rd(); s=rd();
  53. for(int i=;i<=n;i++)w[i]=rd(),v[i]=rd(),mx=max(mx,w[i]);
  54. for(int i=;i<=m;i++)l[i]=rd(),r[i]=rd();
  55. int L=,R=mx+; ans=1e13;
  56. //ans=inf;
  57. while(L<=R)
  58. {
  59. ll ret=work(mid);
  60. // printf("ret=%lld mid=%d L=%d R=%d\n",ret,mid,L,R);
  61. if(ret>=s)
  62. {
  63. // if(ans<=ret-s)break;
  64. ans=min(ans,ret-s); L=mid+;
  65. }
  66. else
  67. {
  68. // if(ans<=s-ret)break;
  69. ans=min(ans,s-ret); R=mid-;
  70. }
  71.  
  72. }
  73. printf("%lld\n",ans);
  74. return ;
  75. }

洛谷 P1314 聪明的质监员 —— 二分的更多相关文章

  1. 洛谷P1314 聪明的质监员

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

  2. 洛谷P1314 聪明的质监员 题解

    题目 聪明的质监员 题解 这道题和之前Sabotage G的那道题类似,都是用二分答案求解(这道题还要简单一些,不需要用数学推导二分条件,只需简单判断一下即可). 同时为了降低复杂度,肯定不能用暴力求 ...

  3. 洛谷 P1314 聪明的质监员【二分+前缀和】

    真是zz, 题目很显然是二分W,然后判断,我一开始是用线段树维护当前w[i]>W的个数和v(公式就是区间满足要求的个数*满足要求的v的和),然后T成70 后来想到树状数组差分常数或许会小,于是改 ...

  4. [NOIP2011] 提高组 洛谷P1314 聪明的质监员

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

  5. 洛谷——P1314 聪明的质监员

    https://www.luogu.org/problem/show?pid=1314 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到n 逐一编号,每 ...

  6. 『题解』洛谷P1314 聪明的质监员

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Portal3: Vijos Description 小T是一名质量监督员,最近负责检验一批矿产的质量.这 ...

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

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

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

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

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

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

随机推荐

  1. linux core dump 生成和调试

    core dump 某些信号的产生会导致产生core dump,包含了进程终止时的内存镜像.在某些时候这个core文件就非常的有用处,配合gdb或者lldb调试起来非常方便. 更详细的文档参考 Lin ...

  2. Python之Pycharm安装及介绍

    在学习Python之前,先安装好编程所需的编译环境也就是IDE,在安装PycharPm之前先安装最新版本的anaconda根据不同的系统选择不同的版本,安装好anaconda以后再安装Pycharm, ...

  3. GPIO——端口位设置/清除寄存器BSRR,端口位清除寄存器BRR

    端口位设置/复位寄存器BSRR: 注:如果同时设置了BSy和BRy的对应位,BSy位起作用. 位31:16  BRy: 清除端口x的位y (y = 0…15)      这些位只能写入并只能以字(16 ...

  4. 阿里云ubuntu服务器安装使用mysql并配置远程连接记录

    实践2要继续做实践1的项目 项目在本地使用本地数据库对于团队开发来说太麻烦了 所以改把项目放在服务器上使用服务器数据库 进入主题 0.参考:https://www.cnblogs.com/ywf520 ...

  5. Postman 安装与使用

    本文是基于 Chrome 浏览器的扩展插件来进行的安装,并非单独应用程序. 1. 官网安装(容易打开出错) 打开官网,https://www.getpostman.com  点击那个灰灰色的「Chro ...

  6. Jupyter notebook使用笔记

    常用快捷键 For a Cell,   Blue -> selecting. Green -> editing. Esc -> exist edit When the cell is ...

  7. [luoguP1981] 表达式求值(U•ェ•*U)

    传送门 弄两个栈,一个存数,一个存运算符,然后乱搞. 代码 #include <cstdio> #include <cstring> #include <iostream ...

  8. JPA的一些坑

    推荐一篇比较好的介绍JPA的文章:使用 Spring Data JPA 简化 JPA 开发 JPA坑1:不支持Limit查询 JPA是不支持Limit分页查询,而我们有时又因为某些原因不想用JPA提供 ...

  9. Linux下汇编语言学习笔记34 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  10. 【天道酬勤】 腾讯、百度、网易游戏、华为Offer及笔经面经(转)

    应届生上泡了两年,一直都是下资料,下笔试题,面试题.一直都在感谢那些默默付出的人.写这个帖子花了我两 个夜晚的时间,不是为了炫耀,只是为了能给那些“迷惘”的学弟学妹,一点点建议而已.大家何必那么认真, ...