题目链接

luogu P3592 [POI2015]MYJ

题解

区间dp

设f[l][r][k]表示区间l到r内最小值>=k的最大收益

枚举为k的位置p,那么包含p的区间答案全部是k

设h[i][j]表示 当前区间穿过i,且c>=j的区间数量,对i的。

然后我们可以做差分,扫一遍,递推出来

\(f[l][r][k]=max(max(f[l][p][k]+f[p+1][r][k]+h[p][k]×k,p∈[l,r]),f[l][r][k+1])\)

对于c离散化

输出方案吼啊

代码

/*
区间dp
设f[l][r][k]表示区间l到r内最小值>=k的最大收益
枚举为k的位置p,那么包含p的区间答案全部是k
设h[i][j]表示 当前区间穿过i,且c>=j的区间数量,对i的。
然后我们可以做差分,扫一遍,递推出来
f[l][r][k]=max(max(f[l][p][k]+f[p+1][r][k]+h[p][k]×k,p∈[l,r]),f[l][r][k+1])
对于c离散化
*/
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9')c = getchar();
while(c <= '9' && c >= '0')x = x * 10 + c -'0',c = getchar();
return x * f;
}
const int maxm = 4007;
const int maxn = 78;
int C[maxm], a[maxm],b[maxm],c[maxm];
int loc[maxn][maxn][maxm];
int dp[maxn][maxn][maxm],h[maxn][maxm];
int n , m , num;
void get_h(int l,int r ) {
for(int i = 1;i <= n;++ i)
for(int j = 1;j <= num;++ j) h[i][j] = 0;
for(int i = 1;i <= m;++ i)
if(l <= a[i] && r >= b[i])
++ h[a[i]][1],-- h[a[i]][c[i] + 1],-- h[b[i] + 1][1],++ h[b[i] + 1][c[i] + 1];
for(int i = l;i <= r;++ i)
for(int j = 1;j <= num;++ j)
h[i][j] += h[i - 1][j] + h[i][j - 1] - h[i - 1][j - 1];
}
int Ans[maxn];
void dfs(int l,int r,int k) {
if(r < l) return;
while(dp[l][r][k] <= dp[l][r][k + 1] && k < num) ++ k;
int Pos = loc[l][r][k];
if(Pos == 0) return ;
Ans[Pos] = C[k];
dfs(l,Pos - 1,k),dfs(Pos + 1,r,k);
}
int main() {
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;++ i)
a[i] = read(),b[i] = read(),C[i] = c[i] = read();
std::sort(C + 1,C + m + 1);
num = unique(C + 1,C + m + 1) - C - 1;
for(int i = 1;i <= m;++ i) c[i] = lower_bound(C + 1,C + num + 1,c[i]) - C;
for(int i = 1;i <= m;++ i)
if(a[i] == b[i])
for(int j = 1;j <= c[i];++ j) dp[a[i]][a[i]][j] += C[j];
for(int i = 1;i <= n;++ i)
for(int j = num - 1;j; -- j) dp[i][i][j] = std::max(dp[i][i][j],dp[i][i][j + 1]);
for(int i = 1;i <= n; ++ i)
for(int j = 0;j <= num; ++ j) loc[i][i][j] = i;
for(int k = 2;k <= n;++ k) {
for(int r, l = 1;l + k - 1 <= n;++ l) {
r = l + k - 1;
get_h(l,r); for(int i = num;i; --i) {
for(int j = l;j <= r;++ j)
if(dp[l][j - 1][i] + dp[j + 1][r][i] + h[j][i] * C[i] >= dp[l][r][i]) {
dp[l][r][i] = dp[l][j - 1][i] + dp[j + 1][r][i] + h[j][i] * C[i];
loc[l][r][i] = j;
}
if(dp[l][r][i] < dp[l][r][i + 1]) {
dp[l][r][i] = dp[l][r][i + 1];
loc[l][r][i] = loc[l][r][i + 1];
}
}
}
}
int ans = 1;
for(int i = 2;i <= num;++ i) {
if(dp[1][n][i] > dp[1][n][ans]) ans = i;
}
printf("%d\n",dp[1][n][ans]);
dfs(1,n,ans);
for(int i = 1;i <= n;++ i) printf("%d ",Ans[i]);
return 0;
}

luogu P3592 [POI2015]MYJ的更多相关文章

  1. P3592 [POI2015]MYJ

    P3592 [POI2015]MYJ 一道比较烦的区间dp.. 昨天上课讲到了这题,然后就在lg翻到了 然后调了很久很久..... 设\(f[l][r][k]\)为区间\([l,r]\)中,最小值\( ...

  2. 洛谷 P3592 [POI2015]MYJ

    题意 给定\(m\)个区间\([a_i,b_i]\)以及\(c_i\),对于一个含有\(n\)个元素的序列\(ans[]\),区间\(i\)对其的贡献为\(\min\{ans_i\}(i\in[a_i ...

  3. BZOJ 4386 Luogu P3597 [POI2015]Wycieczki (矩阵乘法)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/pro ...

  4. BZOJ4377 Kurs szybkiego czytania \ Luogu 3589[POI2015]KUR - 数学思维题

    Solution 我又双叒叕去看题解啦$QAQ$, 真的想不到鸭 输入 $a$ 和 $n$ 互质, 所以满足 $a \times i \ mod \ n$ $(0<=i<n)$ 肯定是不重 ...

  5. Luogu 3594 [POI2015]WIL-Wilcze doły

    简单题. 考虑没有修改数字的条件的限制,我们直接用双指针扫描就可以计算出答案了. 然后考虑加入修改数字的条件,只要用单调队列维护出当前两个指针表示的区间中长度为$d$的一段区间的最大值,用总和减掉这个 ...

  6. Luogu 3586 [POI2015]LOG

    考虑离散化后开权值线段树. 设序列中不小于$s$的数有$cnt$个,小于$s$的数的和为$sum$. 那么操作Z能成功的充要条件是$sum \geq (c - cnt) * s$. 如果序列中不小于$ ...

  7. DP没入门就入土

    写在前面 记录最近刷的DP题 以及 打死都不可能想到状态设计DP系列 汇总 洛谷 P6082 [JSOI2015]salesman 树形\(\texttt{DP}\) + 优先队列 比较容易看出来这是 ...

  8. 【做题记录】DP 杂题

    P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心: 吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 状态: \(f[i][j]\) 表示前 \(i\ ...

  9. Luogu P3783 [SDOI2017]天才黑客

    题目大意 一道码量直逼猪国杀的图论+数据结构题.我猪国杀也就一百来行 首先我们要看懂鬼畜的题意,发现其实就是在一个带权有向图上,每条边有一个字符串信息.让你找一个点出发到其它点的最短路径.听起来很简单 ...

随机推荐

  1. [转]程序进行性能分析工具gprof使用入门

    性能分析工具 软件的性能是软件质量的重要考察点,不论是在线服务程序还是离线程序,甚至是终端应用,性能都是用户体验的关键.这里说的性能重大的范畴来讲包括了性能和稳定性两个方面,我们在做软件测试的时候也是 ...

  2. SQLServer 学习相关资料整理【转】

    存储过程: SQL Server 存储过程 博客园上的一篇文章,讲解的非常详细,有测试代码,很实用. sqlserver存储过程中执行动态sql语句  The Curse and Blessings ...

  3. linux音频alsa-uda134x驱动分析之二(时钟)

    Audio Clocking音频时钟============== This text describes the audio clocking terms in ASoC and digital au ...

  4. MVVM模式的模式简介

    MVVM模式简介 MVVM是Model.View.ViewModel的简写,这种模式的引入就是使用ViewModel来降低View和Model的耦合,说是降低View和Model的耦合.也可以说是是降 ...

  5. grpc 实现微服务生态笔记

    微服务的发展可谓是一波三折,一代一代经历和N多技术成果,grpc只是其中一个,因为其东家是google,明显比较稳定.加上其强大的文档和技术支持和跨平台的支持,在企业级应用上有很大的可信任感,所以也有 ...

  6. Elasticsearch零停机时间更新索引配置或迁移索引

    本文介绍Elasticsearch零宕机时间更新索引配置映射内容的方法,包括字段类型.分词器.分片数等.方法原理就是,利用别名机制,给索引配置别名,所有应用程序都通过别名访问索引.重建索引,通过索引原 ...

  7. opencv(5)GUI

    OpenCV的图形用户界面(Graphical User Interface, GUI)和绘图等相关功能也是很有用的功能,无论是可视化,图像调试还是我们这节要实现的标注任务,都可以有所帮助. 窗口循环 ...

  8. UVA 10891 Game of Sum(区间DP(记忆化搜索))

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  9. Sql Server2005 Transact-SQL 新兵器学习总结之-排名函数

    Transact-SQL提供了4个排名函数: rand() , dense_rand() , row_number() , ntile() 下面是对这4个函数的解释:rank() 返回结果集的分区内每 ...

  10. CVE-2009-3459

     Adobe Acrobat和Reader都是美国Adobe公司开发的非常流行的PDF文件阅读器.         Adobe Reader和Acrobat 7.1.4之前的7.x版本,8.1.7之前 ...