当前位置: 首页 > news >正文

LG9691

考虑 dp。设 \(f_i\) 表示到位置 \(i\) 所需的最小花费,且第 \(i\) 个位置必选,现在要找上一个决策点 \(j\),这个点应该要在此前所有区间的左端点的后面,才能保证这些区间能被覆盖(即确保至少一个在之前每个区间内),则 \(j\) 应满足 \(\max_{r_k<i}l_k \le j < i\),转移方程 \(f_i=\min_{{\max_{r_k<i}l_k} \le j < i}f_j+a_i\)。左边部分将区间按右端点排序后双指针即可,转移使用单调队列即可。

实现时可以令 \(a_{n+1}=0\),这样 \(f_{n+1}\) 可以直接作为答案输出。时间复杂度 \(O(\sum(n+m\log m))\)

#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 1000010
#define int long long
using namespace std;
int n,m,L,R,a[N],q[N],f[N];
struct line{int l,r;
}c[N];
bool cmp(line x,line y){return x.r<y.r;
}
void solve(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i],f[i]=0;    a[n+1]=0;cin>>m;for(int i=1;i<=m;i++)cin>>c[i].l>>c[i].r;sort(c+1,c+m+1,cmp);int j=1;int mx=0;f[1]=a[1];L=1,R=2;q[L]=0,q[R]=1;for(int i=2;i<=n+1;i++){while(j<=m&&c[j].r<i)mx=max(mx,c[j].l),j++;while(L<=R&&q[L]<mx)L++;f[i]=f[q[L]]+a[i];while(L<=R&&f[q[R]]>=f[i])R--;q[++R]=i;// cout<<q[L]<<' '<<i<<' '<<f[i]<<endl;}cout<<f[n+1]<<'\n';return;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--)solve();return 0;
}
http://www.sczhlp.com/news/92883/

相关文章:

  • 即时通讯小程序 - 实践
  • PHP serialize 序列化完全指南
  • 海东高端网站建设价格谁有手机网站
  • 中国空间站拒绝10国名单微信网站建设协议
  • 怎么让同一个局域网上的计算机看到我做的网站asp商城网站源码下载
  • 网站建设内容规划安庆市网站建设制作
  • CF2112C
  • CF342C
  • ICPC/XCPC 做题记录
  • LG9648
  • 电商设计网站有哪些内容品牌推广公司排行榜
  • wordpress 4.9.5 中文优化推广排名网站教程
  • 外链发布工具下载宁波seo外包平台
  • 建站工具 风铃做游戏装备网站可以吗
  • 易网 网站建设wordpress整站搬运
  • 八戒网站做推广电子商务网站设计原则
  • 建立互联网公司网站网站设计板块
  • 微网站 html5佛山网站建设企业推荐
  • 加强社区网站建设智联招聘网最新招聘2022
  • 电影网站建设的意义网上学室内设计哪个平台好
  • LG5689
  • 近五年 CSP NOIP 补题记录
  • CF2111C
  • 唐人日记
  • CF2111B
  • 代做设计的网站网站建设的组织保障
  • 网站闭站做网站排名赚钱吗
  • 在网上怎么建立自己的网站湛江房产网
  • 网站开发人员叫什么佛山智能模板建站
  • 蘑菇街网站服务南宁网站设计推广