题目链接

https://codeforces.com/contest/1322/problem/D
题面写得非常模糊,很容易读错题,建议参考翻译:https://www.luogu.com.cn/problem/CF1322D

题解

(最大的难点是读题?读错题看了一天题解没看懂的蒟蒻枯了)
考虑假设没有选出的 \(l_i\) 不增这个限制,那么答案是和顺序无关的,因为在选出的集合固定后每一位对答案贡献的次数都等于所有小于等于这一位的数之和除以位权下取整的值。
那么可以写出如下 DP: \(f[j][k]\) 表示考虑了第 \(0\) 位至第 \(j\) 位,且恰好有 \(k\) 个等于第 \(j\) 位 (就相当于第 \(j\) 位贡献为 \(k\)),转移可以枚举选多少个。
现在要求选出的 \(l_i\) 不增,那么只需要从后往前扫 (因为原来的 DP 也都是从低位转移到高位),每次刷表即可。\(f[l[i]][k]\) 可以转移到 \(f[l[i]+j][\lfloor\frac{k+1}{2^j}\rfloor]\).
时间复杂度按我的实现应该是 \(O((n^2+nm)\log n)\).
哪位神仙教教我 \(O(n^2+nm)\) 的写法啊 /kel

代码

#include<bits/stdc++.h>
#define llong long long
#define mkpr make_pair
#define riterator reverse_iterator
#define y1 Lorem_ipsum_dolor
using namespace std;inline int read()
{int x = 0,f = 1; char ch = getchar();for(;!isdigit(ch);ch=getchar()) {if(ch=='-') f = -1;}for(; isdigit(ch);ch=getchar()) {x = x*10+ch-48;}return x*f;
}const int mxN = 2e3;
int c[mxN+3],a[mxN+3],w[mxN+mxN+3];
int f[mxN+mxN+3][mxN+3];
int mx[mxN+mxN+3];
int n,m;void updmax(int &x,int y) {x = max(x,y);}int main()
{n = read(),m = read();for(int i=1; i<=n; i++) c[i] = read();for(int i=1; i<=n; i++) a[i] = read();for(int i=1; i<=n+m; i++) w[i] = read();memset(f,213,sizeof(f));for(int i=1; i<=n+m; i++) f[i][0] = 0;for(int i=n; i>=1; i--){for(int k=mx[c[i]]; k>=0; k--){int tmp = k+1,val = -a[i]+w[c[i]];for(int j=0; tmp; j++,tmp>>=1,val+=w[c[i]+j]*tmp){updmax(mx[c[i]+j],tmp);updmax(f[c[i]+j][tmp],f[c[i]][k]+val);}}for(int j=1; j<=n+m; j++) {updmax(f[j][0],max(f[j-1][0],f[j-1][1]));}}printf("%d\n",f[n+m][0]);return 0;
}

Codeforces 1322D Reality Show (DP)相关推荐

  1. Codeforces 919D Substring (拓扑图DP)

    Codeforces 919D Substring (拓扑图DP) 手动博客搬家: 本文发表于20180716 10:53:12, 原地址https://blog.csdn.net/suncongbo ...

  2. [CodeForces 332B]Maximum Absurdity[DP]

    题目链接: [CodeForces 332B]Maximum Absurdity[DP] 题意分析: 寻找两个不重叠的长度为k的子串,使得它们之和最大. 解题思路: 第一想法是,处理出从这个点开始,长 ...

  3. 【CodeForces 1042B --- Vitamins】DP+位运算

    [CodeForces 1042B --- Vitamins]DP+位运算 题目来源:点击进入[CodeForces 1042B - Vitamins] Description Berland sho ...

  4. [CodeForces 300D Painting Square]DP

    http://codeforces.com/problemset/problem/300/D 题意:每一次操作可以选一个正方形,令边长为n,如果n为奇数那么可以从中间画一个十字,分成4个大小相等的边长 ...

  5. CodeForces - 1579G Minimal Coverage(dp)

    题目链接:点击查看 题目大意:给出 nnn 个长度不同的木棍.设第 i−1i-1i−1 次放置木棍后的终点为 xxx,那么第 iii 个木棍有且仅有两种放置方法: 放到 [x+1,x+a[i]][x+ ...

  6. CodeForces - 1562E Rescue Niwen!(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss,将其子串按顺序展开成序列,即 {s1,s1s2,⋯,s1s2-sn,s2,s2s3,s2s3-sn,s3,s3s4,⋯,sn−1 ...

  7. CodeForces - 1551E Fixed Points(dp)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,需要求出删掉最少的数字,使得剩下的数字至少有 kkk 个位置满足 a[i]=ia[i]=ia[i]=i 成立 题目分析:看完数据范围不难想 ...

  8. CodeForces - 1484E Skyline Photo(dp+单调栈)

    题目链接:点击查看 题目大意:给出 nnn 个建筑,每个建筑有一个高度和一个美丽值,现在要求划分为数个连续的区间,使得所有区间的贡献之和最大,其中每个区间的贡献值为,区间中高度最低的建筑物的美丽值 题 ...

  9. CodeForces - 1527E Partition Game(dp+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,现在需要将其划分成 kkk 段,使得贡献和最小 对于每段区间 [l,r][l,r][l,r] 的贡献为,其中每个数字,其最后一次出现的位置 ...

最新文章

  1. 开发日记-20190914 关键词 汇编语言王爽版 第三章
  2. php mysql筛选查询,php-Vicidial的MySQL筛选器
  3. PhpStorm 2017 for Mac 汉化
  4. Builder 模式
  5. 《当程序员的那些狗日日子》(六十一)美丽的天际
  6. @SentinelResource注解实现热点限流
  7. java程序算法实例_java编程算法经典案例
  8. 报错,Error starting ApplicationContext. To display the conditions report re-run your application with
  9. BAT及各大互联网公司前端笔试面试题--Html,Css篇
  10. Ioc--控制反转详解
  11. 搭建个人博客【搭建Hexo+Fluid博客并部署到GitHub/云服务器(阿里云/腾讯云)】
  12. 微信小程序,小游戏数据助手数据爬取!还敢随便授权小游戏吗?
  13. linux系统中开机自启的三种方式
  14. 作为程序员你脱发吗?
  15. 计算机函数sumif求平均值,『如何用sumif求平均年龄』excel表中如何算平均数及标准差...
  16. 计算机网络原理实验运城学院,运城学院力学精品课程--实验教学
  17. Simulink中传递函数transfer fcn中迟滞参数如何设置
  18. idea remote debug Source code does not match the bytecode
  19. 东南大学计算机考研经验
  20. Python中异常操作

热门文章

  1. 吴恩达《神经网络与深度学习》精炼笔记(5)-- 深层神经网络
  2. 赋值运算符函数严谨性的几点思考
  3. openCV视频处理与图像转换
  4. 如何调用DLL (基于Visual C++6.0的DLL编程实现)
  5. C/C++头文件一览
  6. javascript 中this 的用法:
  7. c#操作数据库(二)dataAdapter篇
  8. LGB + KFold 代码 (1)
  9. error: expected ‘{‘ before ‘;‘ token
  10. 扎克伯格做了26张PPT