[USACO12OPEN]Bookshelf G
程序员文章站
2022-06-02 22:02:56
...
题目链接:[USACO12OPEN]Bookshelf G
有一个很显然的式子:
dp[i] = min{ dp[j] + max{ a[j+1]->a[i] } }
然后尺取可以找到最远的可行的j。
直接递推复杂度太高。
我们可以发现可以用单调队列维护可行区间,然后用一个multiset维护单调队列里面的最大值即可。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,m,a[N],b[N],L=1,R,sum,dp[N],q[N];
multiset<int> s;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%lld %lld",&b[i],&a[i]);
for(int i=1,j=0;i<=n;i++){
if(a[i]>m) return puts("-1"),0;
sum+=a[i];
while(sum>m) sum-=a[++j];
while(L<=R&&q[L]<j) s.erase(s.find(dp[q[L]]+b[q[L+1]])),L++;
while(L<=R&&b[q[R]]<=b[i]){
if(L<R) s.erase(s.find(dp[q[R-1]]+b[q[R]]));
R--;
}
q[++R]=i; if(L<R) s.insert(dp[q[R-1]]+b[q[R]]);
dp[i]=dp[j]+b[q[L]];
if(L<R) dp[i]=min(dp[i],*s.begin());
}
cout<<dp[n];
return 0;
}
下一篇: Java获取系统的网卡IP
推荐阅读
-
用 Navicat for Oracle 管理 Oracle10g/11g 数据库
-
用 Navicat for Oracle 管理 Oracle10g/11g 数据库
-
用 Navicat for Oracle 管理 Oracle10g/11g 数据库
-
Oracle 11g客户端在Linux系统上的配置步骤详解
-
python全套视频十五期(116G)
-
Oracle 10g Standby Database 实时应用 redo 数据
-
在RedHat Linux 5.5 (x32/x64)上安装Oracle 10g r2(10.2.0.5)
-
RedHat Linux AS 4.0上安装Oracle 10g Release 2
-
Oracle 10g R2 RAC Install On OEL5 x86_64
-
【免费】某平台 30g经典编程资料下载,百度网盘请带走