P3592 [POI2015]MYJ


一道比较烦的区间dp。。

昨天上课讲到了这题,然后就在lg翻到了

然后调了很久很久。。。。。

设\(f[l][r][k]\)为区间\([l,r]\)中,最小值\(\geq k\)的最大收益(只算被\([l,r]\)包含的)

然后枚举最小值的位置\(p\),那么包含\(p\)的区间答案全部是\(k\)了,只需要算两边的

然后发现很多东西不好算。。。比如说包含\(p\)的区间,所以设\(h[i][j]\)为当前区间穿过\(i\),且\(c>=j\)的区间数量,到每个区间都重新求一下,就好做了

\(f[l][r][k]=max(max(f[l][p-1][k]+f[p+1][r][k]+h[p][k]\times k,p\in[l,r]),f[l][r][k+1])\)

然后输出方案比较麻烦略略略

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cctype>
using namespace std;
typedef int mmp;
#define vd void
#define rg register
#define il inline
#define sta static
#define mp make_pair
il int gi(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
int a[4001],b[4001],c[4001],C[4001];
pair<long long,int>f[54][54][4002];
int h[51][4002];
int S[51];
il vd dfs(int l,int r,int k){
if(l>r)return;
while(f[l][r][k].first==f[l][r][k+1].first&&k<C[0])++k;
int p=f[l][r][k].second;
if(p==0)return;
S[p]=C[k];
dfs(l,p-1,k),dfs(p+1,r,k);
}
mmp main(){
freopen("4380.in","r",stdin);
freopen("4380.out","w",stdout);
int n=gi(),m=gi();
for(rg int i=1;i<=m;++i)a[i]=gi(),b[i]=gi(),c[i]=C[i]=gi();
sort(C+1,C+m+1);
C[0]=unique(C+1,C+m+1)-C-1;
for(rg int i=1;i<=m;++i)c[i]=lower_bound(C+1,C+C[0]+1,c[i])-C;
for(rg int i=1;i<=m;++i){
if(a[i]!=b[i])continue;
for(rg int j=1;j<=c[i];++j)
f[a[i]][a[i]][j].first+=C[j];
}
for(rg int i=1;i<=n;++i)
for(rg int j=C[0];j;--j)
f[i][i][j].second=i;
for(rg int i=1;i<=n;++i)
for(rg int j=C[0]-1;j;--j)
f[i][i][j]=max(f[i][i][j],f[i][i][j+1]);
for(rg int sz=2;sz<=n;++sz)
for(rg int l=1;l+sz-1<=n;++l){
int r=l+sz-1;
for(rg int i=1;i<=n;++i)
for(rg int j=1;j<=C[0];++j)
h[i][j]=0;
for(rg int i=1;i<=m;++i)
if(l<=a[i]&&b[i]<=r)
++h[a[i]][1],--h[a[i]][c[i]+1],--h[b[i]+1][1],++h[b[i]+1][c[i]+1];
for(rg int i=l;i<=r;++i)
for(rg int j=1;j<=C[0];++j)
h[i][j]+=h[i-1][j]+h[i][j-1]-h[i-1][j-1];
for(rg int i=C[0];i;--i){
for(rg int j=l;j<=r;++j)
if(f[l][j-1][i].first+f[j+1][r][i].first+h[j][i]*C[i]>=f[l][r][i].first)
f[l][r][i]=mp(f[l][j-1][i].first+f[j+1][r][i].first+h[j][i]*C[i],j);
f[l][r][i]=max(f[l][r][i+1],f[l][r][i]);
}
}
int ans=1;
for(rg int i=2;i<=C[0];++i)
if(f[1][n][i].first>=f[1][n][1].first)ans=i;
printf("%lld\n",f[1][n][ans].first);
dfs(1,n,ans);
for(rg int i=1;i<=n;++i){
if(S[i]==0)S[i]=C[C[0]];
//printf("%d ",S[i]);
}
return 0;
}

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

  1. luogu P3592 [POI2015]MYJ

    题目链接 luogu P3592 [POI2015]MYJ 题解 区间dp 设f[l][r][k]表示区间l到r内最小值>=k的最大收益 枚举为k的位置p,那么包含p的区间答案全部是k 设h[i ...

  2. 洛谷 P3592 [POI2015]MYJ

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

  3. DP没入门就入土

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

  4. 【做题记录】DP 杂题

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

  5. POI2015 解题报告

    由于博主没有BZOJ权限号, 是在洛咕做的题~ 完成了13题(虽然有一半难题都是看题解的QAQ)剩下的题咕咕咕~~ Luogu3585 [POI2015]PIE Solution 模拟, 按顺序搜索, ...

  6. BZOJ 4385: [POI2015]Wilcze doły

    4385: [POI2015]Wilcze doły Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 648  Solved: 263[Submit][ ...

  7. BZOJ 4384: [POI2015]Trzy wieże

    4384: [POI2015]Trzy wieże Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 217  Solved: 61[Submit][St ...

  8. Bzoj 3747: [POI2015]Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 222[Submit][Stat ...

  9. BZOJ 3747 POI2015 Kinoman 段树

    标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...

随机推荐

  1. CRM总结

    一.CRM初始 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...

  2. Unity调用安卓中的方法遇到的问题

    最近在用U3D做一个简单的迷宫游戏,在项目中利用Unity制作游戏场景,在android中调用游戏场景,并在游戏结束后调用安卓方法,传递参数,退出游戏场景 查找网上资料,基本上Unity调用安卓的写法 ...

  3. AT89S52之串行异步通信笔记

    SRF 中断入口地址 中断源 外中断 外部中断0 INT0(P3.2) 外部中断1 INT1(P3.3) 电平方式触发 低电平 脉冲方式触发 脉冲后延的负跳 内中断 定时中断 串行中断 中断允许控制寄 ...

  4. Memorize and recite an important historical speech

    Memorize and recite an important historical speech memorize['memәraiz]v.[亦作memorise] 记住, 记忆 historic ...

  5. Istio 1.1尝鲜记

    近几天Istio1.1的发布引起了技术界巨大的反响,为了让更多技术爱好者能够亲自体验Istio1.1,公司的技术大佬赶出了这篇尝鲜教程,其中包括环境.安装.可能遇到的问题及解决方式等,希望对大家有所帮 ...

  6. 使用FASTJSON做反序列化的时间格式处理

    JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.mmm"; Productorder tmp1 = JSONObj ...

  7. php实现随机数字、字母的验证码

     php实现随机数字.字母的验证码 可自定义生成验证码文字的大小.数量.干扰项等等,也可以自定义验证文字的字体... 废话不多说,直接上代码: 1.classgd.class.php <?php ...

  8. 【原创】MySQL 生产环境备份还原

    公司需要对生产环境的数据库进行备份,我接下了这份任务. 1. 首先谷歌了以下大家的备份方法 许多都使用到了Xtrabackup这个工具,超大型的公司可能有其他的的备份方法,这个工具对于中小型公司,甚至 ...

  9. JDBC规范(转)

    公司开发一直用的是ibatis,进来心血来潮想研究一下源码,可是发现自己的JDBC似乎已经忘得差不多了,为了自己能顺利的研读ibatis的源码,于是乎找到了 XIAO_DF的JDBC规范的博客,转到自 ...

  10. 2016-3-19日小结:scrollTop

    <div id="div1" style="padding: 0; position:absolute;width: 200px;height: 200px;< ...