题目链接

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. 【译】第十二篇 SQL Server代理多服务器管理

    本篇文章是SQL Server代理系列的第十二篇,详细内容请参考原文 在这一系列的上一篇,我们查看了维护计划,一个维护计划可能会创建多个作业,多个计划.你还简单地看了SSIS子系统,并查看了维护计划作 ...

  2. 关于Unix/Linux的终端、伪终端、控制台和shell

    历史是什么:是过去传到将来的回声,是将来对过去的反映. ——雨果(法)<笑面人> 阅读本文大概需要花费你15分钟 文章导航: 计算机的发展 UNIX系统的诞生 UNIX系统的发展 终端与控 ...

  3. css3兼容性问题归纳

    Android2.3的overflow问题 在android2.3及以下系统版本的浏览器不支持overflow:scroll / auto,即在页面元素里面的内容如果超过了父元素或祖先元素的高度是无法 ...

  4. Struts2笔记2--动态方法调用和Action接收请求方式

    动态方法调用(在请求的时候,再明确具体的响应方法,配置的时候不明确): LoginAction类中有两个方法some和second 1. 动态方法的调用(修改常量struts.enable.Dynam ...

  5. 让arch阻止某个软件包的升级

    我更新了eclipse-java Mars版本的,感觉特别的卡,而且还有好多bug,不知道为什么,因此我去官网下载了luna版本的eclipse的安装包,不知道怎么下载的点击这里,然后安装luna版本 ...

  6. 【FCS NOI2018】福建省冬摸鱼笔记 day1

    省冬的第一天. 带了本子,笔,一本<算法导论>就去了.惊讶于为什么同学不带本子记笔记. 他们说:“都学过了.”,果然这才是巨神吧. 第一天:数论,讲师:zzx 前几页的课件挺水,瞎记了点笔 ...

  7. 渗透测试的WINDOWS NTFS技巧集合

    译者:zzzhhh 这篇文章是来自SEC Consult Vulnerability Lab的ReneFreingruber (@ReneFreingruber),分享了过去几年从各种博客文章中收集的 ...

  8. 工作常用shell集合

    <1>日志回滚案例======>[root@localhost test]# cat hbase.sh hbase_rotate_log ()       {    log=$1;  ...

  9. bootstrap-fileinput上传文件的插件使用总结----编辑已成功上传过的图片

    http://plugins.krajee.com/file-plugin-methods-demo 具体操作 http://plugins.krajee.com/file-preview-manag ...

  10. 用户说体验 | 关于阿里百川HotFix你需要了解的一些细节

    最近很火的热修复技术,无意中了解到阿里百川也在做,而且Android.iOS两端都支持,所以决定试一试.试用一段时间后,感觉还不错,主要是他们有一个团队在不断维护更新这个产品,可以看到他们的版本更新记 ...