当前位置: 首页 > news >正文

BZOJ4380: [POI2015]Myjnie

Description

有n家洗车店从左往右排成一排,每家店都有一个正整数价格p[i]。
有m个人要来消费,第i个人会驶过第a[i]个开始一直到第b[i]个洗车店,且会选择这些店中最便宜的一个进行一次消费。但是如果这个最便宜的价格大于c[i],那么这个人就不洗车了。
请给每家店指定一个价格,使得所有人花的钱的总和最大。

Input

第一行包含两个正整数n,m(1<=n<=50,1<=m<=4000)。
接下来m行,每行包含三个正整数a[i],b[i],c[i](1<=a[i]<=b[i]<=n,1<=c[i]<=500000)

Output

第一行输出一个正整数,即消费总额的最大值。
第二行输出n个正整数,依次表示每家洗车店的价格p[i],要求1<=p[i]<=500000。
若有多组最优解,输出任意一组。

Sample Input

7 5
1 4 7
3 7 13
5 6 20
6 7 1
1 2 5

Sample Output

43
5 5 13 13 20 20 13
 
将所有c[i]离散,设f[l][r][j]表示[l,r]区间内,最小值>=j的收益。
设g[x][j]表示所有[l,r]中c[i]>=j的区间个数,即每个人的贡献,然后序列DP即可。
时间复杂度为O(N^3*M)
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
	if(head==tail) {
		int l=fread(buffer,1,BufferSize,stdin);
		tail=(head=buffer)+l;
	}
	return *head++;
}
inline int read() {
    int x=0,f=1;char c=getchar();
    for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
    for(;isdigit(c);c=getchar()) x=x*10+c-'0';
    return x*f;
}
const int maxn=55;
const int maxm=4005;
int n,m,B[maxn],s[maxm],t[maxm],A[maxm],tmp[maxm];
int f[maxn][maxn][maxm],p[maxn][maxn][maxm],g[maxn][maxm];
void print(int l,int r,int j) {
	if(l>r) return;
	int x=p[l][r][j];
	if(!x) print(l,r,j+1);
	else print(l,x-1,j),B[x]=tmp[j],print(x+1,r,j);
}
int main() {
	n=read();m=read();
	rep(i,1,m) s[i]=read(),t[i]=read(),A[i]=tmp[i]=read();
	sort(tmp+1,tmp+m+1);
	rep(i,1,m) A[i]=lower_bound(tmp+1,tmp+m+1,A[i])-tmp;
	dwn(l,n,1) rep(r,l,n) {
		rep(i,l,r) rep(j,1,m) g[i][j]=0;
		rep(j,1,m) if(l<=s[j]&&t[j]<=r) g[s[j]][A[j]]++,g[t[j]+1][A[j]]--;
		rep(i,l,r) rep(j,1,m) g[i][j]+=g[i-1][j];
		rep(i,l,r) dwn(j,m,2) g[i][j-1]+=g[i][j];
		dwn(j,m,1) {
			int& ans=f[l][r][j];
			rep(x,l,r) {
				int res=f[l][x-1][j]+f[x+1][r][j]+tmp[j]*g[x][j];
				if(res>=ans) p[l][r][j]=x,ans=res;
			}
			if(f[l][r][j+1]>ans) {
				ans=f[l][r][j+1];
				p[l][r][j]=0;
			}
		}
	}
	printf("%d\n",f[1][n][1]);
	print(1,n,1);
	rep(i,1,n) printf("%d%c",B[i],i==n?'\n':' ');
	return 0;
}

  

转载于:https://www.cnblogs.com/wzj-is-a-juruo/p/5413982.html

相关文章:

  • iOS开发经验总结
  • 人机交互——对搜狗输入法的评价
  • cocos2d-x-3.0 的改变,由于变得太多,一点点累积吧!
  • ThinkPHP函数详解系列
  • 通过手动创建统计信息优化sql查询性能案例
  • EmguCV(OpenCV)实现高效显示视频(YUV)叠加包括汉字
  • 如何优化sql语句
  • Android深度探索(卷1)HAL与驱动开发--读书笔记(第三章)
  • 怎么把文字设置为显示隐藏按钮
  • FCKeditor jsp配置
  • 将字符串编码成数值,求数值最大和问题
  • crontab 安装 和一些 简单的命令
  • eclipse 编译的时候 自动把SDK需要放入libs里面的so文件给删除了
  • 事件处理
  • 实测可用的宽度优先爬虫的实现
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • flask接收请求并推入栈
  • If…else
  • iOS 系统授权开发
  • Java精华积累:初学者都应该搞懂的问题
  • Making An Indicator With Pure CSS
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • react 代码优化(一) ——事件处理
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • VuePress 静态网站生成
  • Yii源码解读-服务定位器(Service Locator)
  • 半理解系列--Promise的进化史
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 区块链分支循环
  • 使用common-codec进行md5加密
  • 系统认识JavaScript正则表达式
  • 项目实战-Api的解决方案
  • 栈实现走出迷宫(C++)
  • - 转 Ext2.0 form使用实例
  • #if #elif #endif
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C语言)逆序输出字符串
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (三)Honghu Cloud云架构一定时调度平台
  • (十一)图像的罗伯特梯度锐化
  • (五)Python 垃圾回收机制
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .project文件
  • @Autowired多个相同类型bean装配问题
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @property @synthesize @dynamic 及相关属性作用探究
  • @RunWith注解作用
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20190416]完善shared latch测试脚本2.txt