[NOIP2011] 聪明的质监员 二分+前缀和
考试的时候打的二分但没有用前缀和维护。但是有个小细节手误打错了结果挂掉了。
绝对值的话可能会想到三分,但是注意到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] 聪明的质监员 二分+前缀和的更多相关文章
- Luogu P1314 聪明的质监员(二分+前缀和)
P1314 聪明的质监员 题意 题目描述 小\(T\)是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有\(n\)个矿石,从\(1\)到\(n\)逐一编号,每个矿石都有自己的重量\(w_i\) ...
- NOIP2011聪明的质监员题解
631. [NOIP2011] 聪明的质监员 ★★ 输入文件:qc.in 输出文件:qc.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 小 T 是一名质量监督 ...
- NC16597 [NOIP2011]聪明的质监员
NC16597 [NOIP2011]聪明的质监员 题目 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 \(n\) 个矿石,从 \(1\) 到 \(n\) 逐一编号,每个矿 ...
- P1314 聪明的质监员(前缀和+二分)
P1314 聪明的质监员 显然可以二分参数W 统计Y用下前缀和即可. #include<iostream> #include<cstdio> #include<cstri ...
- 【洛谷P1314】[NOIP2011]聪明的质监员
聪明的质监员 题目链接:https://www.luogu.org/problemnew/show/P1314 Y(W)随W的值增大而减小 二分W的值,找到最小的W使得Y(W)>S: 比较Y(W ...
- $Noip2011/Luogu1314$ 聪明的质监员 二分+巧妙前缀和
$Luogu$ $Sol$ 首先$W$一定是某个$w_i$.于是一种暴力方法就出炉了,枚举$W$再计算. 注意到,满足$S-Y$的绝对值最小的$Y$只可能是两种,一种是$<S$的最大的$Y$,一 ...
- [NOIP2011]聪明的质监员 题解
题目大意: 额--貌似蛮清晰的,就不赘述了. 思路: 首先不难发现M越大Y越小,因此可以二分答案(方向不要弄错),二分出最小的不小于S的Y即可.而计算Y时可用前缀和O(n+m)求得.两种边界情况也要考 ...
- Luogu P1314 聪明的质监员 二分答案
题目链接 Solution 这个范围不是二分就是结论题就是数学题... 然后再看一会差不多就可以看出来有单调性所以就可以确定二分的解法了 二分那个$W$,用前缀和$O(n+m)$的时间来求出对答案的贡 ...
- Luogu 1314 [NOIP2011] 聪明的质监员
二分答案 + 前缀和. 题面中式子的意思是每一个区间$[l, r]$的贡献是这个区间内$w_i \geq W$的个数乘以这些$i$的$v_i$和. 很快发现了答案具有单调性,可以做两遍二分,分别看看小 ...
随机推荐
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 页面刷新vuex数据消失问题解决方案
VBox持续进行中,哀家苦啊,有没有谁给个star. vuex是vue用于数据存储的,和redux充当同样的角色. 最近在VBox开发的时候遇到的问题,页面刷新或者关闭浏览器再次打开的时候数据归零.这 ...
- FFT/NTT 多项式学习笔记
FFT(快速傅立叶变换)和NTT(快速数论变换)看上去很高端,真正搞懂了就很simple了辣. 首先给出多项式的一些定义(初中数学内容): 形如Σaixi的式子就是多项式! 多项式中每个单项式叫做多项 ...
- 工厂方法模式(Java与Kotlin版)
前文推送 设计模式 简单工厂模式(Java与Kotlin版) Kotlin基础知识 Kotlin入门第一课:从对比Java开始 Kotlin入门第二课:集合操作 Kotlin入门第三课:数据类型 初次 ...
- JQuery中实现Ajax
简单小案例: $("input").click(function() { $.get("test.txt",function(data){ $("h1 ...
- webpack1 新手入门教程
本文github仓库地址: https://github.com/Rynxiao/webpack-tutorial ,里面包括了本教程的所有代码. [如果你觉得这篇文章写得不错,麻烦给本仓库一颗星:- ...
- IntelliJ IDEA 调试(debug)时非常慢的原因
IntelliJ IDEA 开发时,发现有时Debug时tomcat启动的非常慢,需要等待超过20分钟,但有时就很快,经查找发现是断点设置问题, 若断点设置在方法名上,debug时就会非常慢, 如图 ...
- iconfont字体图标的使用方法--超简单!
我之前因为项目用bootstrap比较多,所以使用font awesome字体图标比较多,后来接触到了iconfont,发现想要的什么图标都有,还可以自定义图标,非常强大!之前看了一波教程,觉得繁琐, ...
- HTML5 服务器推送事件(Server-sent Events)
服务器推送事件(Server-sent Events)WebSocket 协议的一种服务器向客户端发送事件&数据的单向通讯.目前所有主流浏览器均支持服务器发送事件,当然除了 Internet ...
- nodejs服务器部署教程二
这篇文章主要介绍如何在服务端跑vuejs的项目,如果上一篇教程你成功输出了hello world,那这一篇更简单 首先你要有一个已经能在本地跑的基于vuejs的项目,我就以之前写的仿饿了么的项目为例来 ...