【JZOJ4931】A

来源:互联网 发布:理解大数据 编辑:程序博客网 时间:2024/04/30 01:43

Description

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

Solution

先把数离散化。

考虑区间dp,设fl,r,x表示区间[l,r]中最小的数为x。

枚举中间的一个位置p[l,r],代表当前花费最小的位置,那么有

fl,r,x=max(fl,r,x,fl,p1,x+fp+1,r,x+西)

我们考虑怎么求这个奇怪的东西(也就是跨越中间p的贡献),那我们显然要知道[l,r]有多少人是可以接受x的。

设这个人数为tot,显然可以开个桶然后把区间在[l,r]范围内的Ci扔进去,求个后缀和即可。

那么总的方程:

fl,r,x=max(fl,r,x,fl,p1,x+fp+1,r,x+totx)

因为我们f求的是以x为最小值的,所以还要取后缀最大值。

Code

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#define max(a,b) ((a)>(b))?(a):(b)#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)#define N 55#define M 4010#define MAX 500010using namespace std;int a[M],b[M],c[M],cc[M];int ls[MAX],yl[M],tt=0;int f[N][N][M],g[N][M];int main(){    int n,m;    scanf("%d %d",&n,&m);    fo(i,1,m) scanf("%d %d %d",&a[i],&b[i],&c[i]),cc[i]=c[i];    sort(cc+1,cc+m+1);    fo(i,1,m)    {        ls[cc[i]]=++tt;        yl[tt]=cc[i];    }    fo(len,1,n)    fo(l,1,n-len+1)    {        int r=l+len-1;        memset(g,0,sizeof(g));        fo(i,1,m) if(a[i]>=l && b[i]<=r)        fo(j,a[i],b[i]) g[j][ls[c[i]]]++;        fo(i,l,r)        fd(j,tt-1,1) g[i][j]+=g[i][j+1];        fo(i,l,r)        fd(x,tt,1)        f[l][r][x]=max(max(f[l][r][x],f[l][r][x+1]),f[l][i-1][x]+f[i+1][r][x]+g[i][x]*yl[x]);    }    printf("%d",f[1][n][1]);}
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕清洁度iv度怎么办 怀孕了下面有异味怎么办 孕妇尿白细胞1是怎么办 药流期间喂奶了怎么办 20多岁卵巢早衰怎么办 3岁儿童肚子胀气怎么办 肚子又胀又痛怎么办 1岁宝宝肚子胀气怎么办 2岁宝宝肚子胀气怎么办 产后腰粗肚子大怎么办 发烧后腹泻拉水怎么办 又吐又拉还发烧怎么办 喝中药恶心想吐怎么办 生完孩子肛门疼怎么办 拉完大便肛门痛怎么办 肚子总是凉凉的怎么办 京东金条风控了怎么办 京东维修没发票怎么办 假牙吞到肚子里怎么办 眼睛一只大一只小怎么办 一个眼睛大一个眼睛小怎么办 电脑上的字模糊怎么办 无忧乐行注销了怎么办 连供墨盒有空气怎么办 30岁突然停经了怎么办 下面很痒怎么办白带多 私处有点痒怎么办洗液 人的下体皮肤痒怎么办 打球手指关节肿了怎么办 婴儿2个月鼻塞怎么办 3个月婴儿鼻塞怎么办 2个月婴儿感冒了怎么办 头发剪短了很丑怎么办 头发剪了后悔了怎么办 额头的碎头发翘怎么办 带耳机时间长耳朵疼怎么办 种的睫毛容易掉怎么办 走路多了脚背疼怎么办 扭伤脚筋怎么办恢复快 脚背上的筋断了怎么办 腿上的筋疼怎么办