题目传送门(内部题134)


输入格式

  第一行两个数$N,L$。
  接下来$N$行每行两个数$A_i,B_i$。
  接下来$N$行每行一个整数$C_i$。


输出格式

  一行一个整数表示答案,无解输出$-1$。


样例

样例输入1:

3 9
6 3
5 2
3 1
2
2
2

样例输出1:

2

样例输入2:

5 20
3 2
4 2
6 3
8 4
10 5
4
2
3
4
5

样例输出2:

-1


数据范围与提示

  对于$40\%$的数据,$N\leqslant 1,000$;
  对于额外$20\%$的数据,$B_i=0$;
  对于额外$20\%$的数据,$C_i=0$;
  对于$100\%$的数据,$n\leqslant 10^5,0\leqslant A_i,B_i,C_i\leqslant 10^9$。


题解

瞎打都能过的题……

考场打了个假贪心$A$掉了,然而打部分分的$KX$表示不服(因为数据中没有给部分分),于是他就跟教练要求要出数据,于是……

上面的$KX$有他博客的链接,欢迎大家消费$+$吐槽。

考场上的贪心实际上已经很接近正解了。

首先,按$A_i-B_i$排序,在爬不上去的情况下一定是优先选择$A_i-B_i$最大的。

然后发现其实有的时候可以用一个$A_i$很大的“冲”上去,所以开一个大根堆就好了。

但是还有一个情况,我们可以用一些$A_i-B_i$比较小的“积蓄能量”,然后用一个$A_i-B_i$较大但是$A_i$更大的“冲”上去。

然后发现只与最后一个有关,所以可以只考虑最后一个选什么,用倍增思想维护即可。

时间复杂度:$\Theta(n\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int A,B,delta;}e[100001];
int N;
long long L;
long long C[100001],S[100001],F[20][100001];
int lg[100001];
int limits;
bool vis[100001];
int ans=0x3f3f3f3f;
bool cmp(rec a,rec b){return a.delta>b.delta;}
int cal(int l,int r){return min(F[lg[r-l+1]][l],F[lg[r-l+1]][r-(1<<lg[r-l+1])+1]);}
int main()
{
scanf("%d%lld",&N,&L);vis[0]=1;
for(int i=2;i<=N;i++)lg[i]=lg[i>>1]+1;
for(int i=1;i<=N;i++)
{
scanf("%d%d",&e[i].A,&e[i].B);
e[i].delta=e[i].A-e[i].B;
}
sort(e+1,e+N+1,cmp);limits=N;
for(int i=1;i<=N;i++)if(e[i].delta<0){limits=i-1;break;}
for(int i=1;i<=N;i++)
{
scanf("%d",&C[i]);
C[i]+=C[i-1];
S[i]=S[i-1]+e[i].delta;
F[0][i]=S[i]+e[i].delta-C[i];
if(vis[i-1]&&C[i]<S[i])vis[i]=1;
}
for(int i=1;i<=lg[N];i++)
for(int j=1,s=(1<<(i-1));j<=N-(1<<j)+1;j++)
F[i][j]=min(F[i-1][j],F[i-1][j+s]);
long long now;
int pos;
for(int i=1;i<N;i++)
{
now=L+e[i].delta-e[i].A;
pos=lower_bound(S+1,S+limits+1,now)-S;
if(pos==limits+1)continue;
if(vis[i-1]&&pos>i)
if(cal(i,pos)>e[i].delta)
ans=min(ans,pos);
}
for(int i=N,mx=0;i>=0;i--)
{
if(vis[i]&&S[i]+mx>=L)
ans=min(ans,i+1);
mx=max(mx,e[i].A);
}
if(ans==0x3f3f3f3f)puts("-1");
else printf("%d\n",ans);
return 0;
}

rp++

[CSP-S模拟测试]:爬(贪心)的更多相关文章

  1. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  2. csp-s模拟测试99

    csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...

  3. csp-s模拟测试95

    csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...

  4. csp-s模拟测试92

    csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼 ...

  5. csp-s模拟测试85

    csp-s模拟测试85 $T1$全场秒切没有什么区分度,$T2$全场成功转化题意但是我并不会打,$T3$暴力都没打很遗憾. 100 00:21:49 02:56:35 02:56:49 135 02: ...

  6. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  7. 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组

    2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...

  8. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  9. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

随机推荐

  1. python_0基础开始_day11

    第十一节 一,函数名的第一类对象 函数名当作值,赋值给变量 print(函数名) 查看看书的内存地址 函数名可以当作容器中的元素 lis = []dic = {}def func():    prin ...

  2. ZuulServlet源码分析及ZuulFilter加载

    参考https://yq.aliyun.com/wenji/2...https://blog.csdn.net/lds2227... 1.声明ZuulServlet @Configuration @E ...

  3. selenium自动化测试工具模拟登陆爬取当当网top500畅销书单

    selenium自动化测试工具可谓是爬虫的利器,基本动态加载的网页都能抓取,当然随着大型网站的更新,也出现针对selenium的反爬,有些网站可以识别你是否用的是selenium访问,然后对你加以限制 ...

  4. ABCD 谁是小偷

    题目: 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷.审问中,a说:“我不是小偷.”b说:“c是小偷.”c说:“小偷肯定是d.”d说:“c在胡说.” 现在已经知道这四人中有三人说的是真 ...

  5. commons Collections4 MultiMap

    MultiMap<String, Integer> multiMap = new MultiValueMap<>(); multiMap.put("A", ...

  6. Linux下创建仓库的软件包createrepo

    createrepo是linux下的创建仓库的软件包.create是创建的意思,repo是repository的缩写,是仓库的意思. yum(Yellow dog Updater,Modified)主 ...

  7. python、第六篇:视图、触发器、事务、存储过程、函数

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  8. numpy中与金融有关的函数

    fv函数 计算未来的价值 def fv(rate, nper, pmt, pv, when='end'): ... 参数: rate:存款/贷款每期的利率 nper:存款/贷款期数 pmt:存款/贷款 ...

  9. RE 逆向工程初学者指南:方法和工具

    简评: RE 两种分析,静态.动态.好好分析静态因为能够解决 70 % 的问题.介绍了一些工具和方法.Enjoy yourself. 最近几天,我决定试水逆向工程,即使在计算机和编程相关领域有一定的基 ...

  10. ora 12518监听程序无法分发客户机连接

    首先修改ORACLE的PROCESS.SESSION数量 查看当前ORALCE PROCESS数量 SQL> show parameter process 查看当前ORALCE SESSION数 ...