P3592 [POI2015]MYJ
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的更多相关文章
- luogu P3592 [POI2015]MYJ
题目链接 luogu P3592 [POI2015]MYJ 题解 区间dp 设f[l][r][k]表示区间l到r内最小值>=k的最大收益 枚举为k的位置p,那么包含p的区间答案全部是k 设h[i ...
- 洛谷 P3592 [POI2015]MYJ
题意 给定\(m\)个区间\([a_i,b_i]\)以及\(c_i\),对于一个含有\(n\)个元素的序列\(ans[]\),区间\(i\)对其的贡献为\(\min\{ans_i\}(i\in[a_i ...
- DP没入门就入土
写在前面 记录最近刷的DP题 以及 打死都不可能想到状态设计DP系列 汇总 洛谷 P6082 [JSOI2015]salesman 树形\(\texttt{DP}\) + 优先队列 比较容易看出来这是 ...
- 【做题记录】DP 杂题
P2577 [ZJOI2004]午餐 $\texttt{solution}$ 想到贪心: 吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序. 状态: \(f[i][j]\) 表示前 \(i\ ...
- POI2015 解题报告
由于博主没有BZOJ权限号, 是在洛咕做的题~ 完成了13题(虽然有一半难题都是看题解的QAQ)剩下的题咕咕咕~~ Luogu3585 [POI2015]PIE Solution 模拟, 按顺序搜索, ...
- BZOJ 4385: [POI2015]Wilcze doły
4385: [POI2015]Wilcze doły Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 648 Solved: 263[Submit][ ...
- BZOJ 4384: [POI2015]Trzy wieże
4384: [POI2015]Trzy wieże Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 217 Solved: 61[Submit][St ...
- Bzoj 3747: [POI2015]Kinoman 线段树
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 553 Solved: 222[Submit][Stat ...
- BZOJ 3747 POI2015 Kinoman 段树
标题效果:有m点,每个点都有一个权值.现在我们有这个m为点的长度n该序列,寻求区间,它仅出现一次在正确的点区间内值和最大 想了很久,甚至神标题,奔说是水的问题--我醉了 枚举左点 对于每个请求留点右键 ...
随机推荐
- CRM总结
一.CRM初始 CRM,客户关系管理系统(Customer Relationship Management).企业用CRM技术来管理与客户之间的关系,以求提升企业成功的管理方式,其目的是协助企业管理销 ...
- Unity调用安卓中的方法遇到的问题
最近在用U3D做一个简单的迷宫游戏,在项目中利用Unity制作游戏场景,在android中调用游戏场景,并在游戏结束后调用安卓方法,传递参数,退出游戏场景 查找网上资料,基本上Unity调用安卓的写法 ...
- AT89S52之串行异步通信笔记
SRF 中断入口地址 中断源 外中断 外部中断0 INT0(P3.2) 外部中断1 INT1(P3.3) 电平方式触发 低电平 脉冲方式触发 脉冲后延的负跳 内中断 定时中断 串行中断 中断允许控制寄 ...
- Memorize and recite an important historical speech
Memorize and recite an important historical speech memorize['memәraiz]v.[亦作memorise] 记住, 记忆 historic ...
- Istio 1.1尝鲜记
近几天Istio1.1的发布引起了技术界巨大的反响,为了让更多技术爱好者能够亲自体验Istio1.1,公司的技术大佬赶出了这篇尝鲜教程,其中包括环境.安装.可能遇到的问题及解决方式等,希望对大家有所帮 ...
- 使用FASTJSON做反序列化的时间格式处理
JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.mmm"; Productorder tmp1 = JSONObj ...
- php实现随机数字、字母的验证码
php实现随机数字.字母的验证码 可自定义生成验证码文字的大小.数量.干扰项等等,也可以自定义验证文字的字体... 废话不多说,直接上代码: 1.classgd.class.php <?php ...
- 【原创】MySQL 生产环境备份还原
公司需要对生产环境的数据库进行备份,我接下了这份任务. 1. 首先谷歌了以下大家的备份方法 许多都使用到了Xtrabackup这个工具,超大型的公司可能有其他的的备份方法,这个工具对于中小型公司,甚至 ...
- JDBC规范(转)
公司开发一直用的是ibatis,进来心血来潮想研究一下源码,可是发现自己的JDBC似乎已经忘得差不多了,为了自己能顺利的研读ibatis的源码,于是乎找到了 XIAO_DF的JDBC规范的博客,转到自 ...
- 2016-3-19日小结:scrollTop
<div id="div1" style="padding: 0; position:absolute;width: 200px;height: 200px;< ...