牛客练习赛79E-小G的数学难题【dp,单调队列】
正题
题目链接:https://ac.nowcoder.com/acm/contest/11169/E
题目大意
给出\(n\)个三元组\((a_i,b_i,c_i)\)。
要求选出一个集合\(S\),要求
\]
且最小化\(\sum_{i\in S}c_i\)
\(1\leq T\leq 5,1\leq n\leq 1000,1\leq P\leq 10000,1\leq a_i\leq b_i\leq 2\times 10^6,1\leq c_i\leq 2\times 10^6\)
解题思路
暴力的思路是设\(f_{i,l,r}\)表示到第\(i\)个,\(a_i\)的和为\(l\),\(b_i\)的和为\(r\)时的最小值。
但是这个\(O(nP^2)\)的显然不行,发现有一个\(a_i\leq b_i\)的性质考虑怎么使用。
其实还要一个相关的性质就是两个的限制的\(P\)是相等的,虽然看起来比较废话但确实是有用的。
一个十分巧妙的\(dp\)是设\(f_{i,j}\)表示\(a_i\)的和\(\leq j\)且\(b_i\)的和\(\geq j\)。虽然这样的限制不完全,但是这样确实可以统计到最小答案且不会统计到更小答案。
转移就是
\]
这样每一层用单调队列维护就可以了
时间复杂度\(O(TnP)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=1100;
ll T,n,P,a[N],b[N],c[N],f[N][N*10],q[N*10];
signed main()
{
scanf("%lld",&T);
while(T--){
scanf("%lld%lld",&n,&P);
for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);
for(ll i=1;i<=n;i++)scanf("%lld",&b[i]);
for(ll i=1;i<=n;i++)scanf("%lld",&c[i]);
memset(f,0x3f,sizeof(f));f[0][0]=0;
for(ll i=1;i<=n;i++){
ll tail=0,head=1,z=-1;
for(ll j=0;j<=P;j++){
f[i][j]=f[i-1][j];
ll l=j-b[i],r=j-a[i];
while(z<r){
z++;
if(f[i-1][z]>=1e18)continue;
while(head<=tail&&f[i-1][q[tail]]>f[i-1][z])tail--;
q[++tail]=z;
}
while(head<=tail&&q[head]<l)head++;
if(head<=tail)f[i][j]=min(f[i][j],f[i-1][q[head]]+c[i]);
}
}
if(f[n][P]>=1e18)printf("IMPOSSIBLE!!!\n");
else printf("%lld\n",f[n][P]);
}
return 0;
}
牛客练习赛79E-小G的数学难题【dp,单调队列】的更多相关文章
- 牛客挑战赛30 小G砍树 树形dp
小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...
- 牛客练习赛51 C 勾股定理 (数学,结论)
链接:https://ac.nowcoder.com/acm/contest/1083/C来源:牛客网 题目描述 给出直角三角形其中一条边的长度n,你的任务是构造剩下的两条边,使这三条边能构成一个直角 ...
- 牛客练习赛42D(性质、数学)
题目传送 就像题解所说的,写几个可以发现有分成四段的性质:第一段是从n开始往下贪,第二段是个数字,第三段……卧槽好吧真难描述. 然后发现这个数据量可达1e9,所以考虑“二分确定序列+数学计算”的方式解 ...
- 牛客练习赛$48E$ 小$w$的矩阵前$k$大元素 堆
正解:堆 解题报告: 传送门$QwQ$ 考虑把$b$从大往小排序,然后把$a_1+b_1,a_2+b_1,...,a_n+b_1$丢到堆里,顺便记录下$b$的下标 然后每次拿出一个最大值,设为$mx= ...
- 牛客挑战赛30-T3 小G砍树
link 题目大意: n个节点的带标号无根树.每次选择一个度数为1的节点并将它从树上移除.问总共有多少种不同的方式能将这棵树删到只剩 1 个点.两种方式不同当且仅当至少有一步被删除的节点不同. 题解: ...
- 2019 牛客暑期多校 G subsequence 1 (dp+组合数)
题目:https://ac.nowcoder.com/acm/contest/885/G 题意:给你两个串,要求上面哪个串的子序列的值大于下面这个串的值的序列个数,不含前导零 思路:我们很容易就可以看 ...
- 牛客小白月赛1 G あなたの蛙は旅⽴っています【DP】
题目链接 https://www.nowcoder.com/acm/contest/85/G 思路 按照题解上的方式 存取数据 然后DP一下 就可以了 AC代码 #include <cstdio ...
- 2019牛客多校第六场J-Upgrading Technology(枚举+单调队列)
Upgrading Technology 题目传送门 解题思路 对于这题,我们可以枚举一个k从0~m,表示当前我们把所有技能最少升到了k级,且至少有一个为k级. 此时我们刚好获得了前k个d[]的收益, ...
- 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)
牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...
- 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)
牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
随机推荐
- cad转换成png,svg
1.设置仓库可以在setting.xml中设置(也可以在pom中设置,设置项即可) <mirror> <id>AsposeJavaAPI</id> <name ...
- 【spring 注解驱动开发】扩展原理
尚学堂spring 注解驱动开发学习笔记之 - 扩展原理 扩展原理 1.扩展原理-BeanFactoryPostProcessor BeanFactoryPostProcessor * 扩展原理: * ...
- commandBinding 的命令
<Window x:Class="WpfApplication1.Window29" xmlns="http://schemas.microsoft.com/win ...
- C#中的信号量---Semaphore
emaphore是System.Threading下的类,限制可同时访问某一资源或资源池的线程数. 常用构造方法 https://msdn.microsoft.com/zh-cn/library/e1 ...
- uwp 之多媒体开发
xml code ----------------------------------------------------- <Page x:Class="MyApp.MainPage ...
- QT 中的模态和非模态对话框
void MainWindow::on_pushButton_clicked() { //模态 QDialog dlg(this); dlg.resize(100,100); dlg.exec(); ...
- 再也不用担心了,微软官方系统(win10为例)U盘安装教程
参考文章地址 使用微软官方工具安装纯净版操作系统. 一.准备工作 检查电脑规格是否支持安装(主要看看系统配置是否满足系统运行的最低要求) 一台联网电脑(不一定非是要装系统的那台): 一个≥8G 空间的 ...
- Python的GPU编程实例——近邻表计算
技术背景 GPU加速是现代工业各种场景中非常常用的一种技术,这得益于GPU计算的高度并行化.在Python中存在有多种GPU并行优化的解决方案,包括之前的博客中提到的cupy.pycuda和numba ...
- Windows下Rancher复制Pod内文件到本地
Rancher 未提供直接获取 Pod 内文件的工具(如果有请评论告知下,蟹蟹),但提供了 Rancher 的 CLI 客户端,通过 CLI 可以调用 k8s 的 CLI (kubectl) 命令来操 ...
- 记一次《C语言踩内存》问题定位有感
踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机.产生踩内存的的原因也比较多样,比较典型的有如下几种: 数组越界访问 字符串越界操作 直接操作野 ...