题目:

题解:

我们考虑把每对花色相同的牌看作区间。

那么如果我们设 \(f_i\) 表示决策在 \([1,i]\) 内的最优答案.

那么有 \(f_i = max\{max\{(f_{j-1}+\sum_{k=j}^iv_k) | a_{j-1} = a_i\},f_{i-1}\}\)

我们可以记录每个点上一次出现的位置 \(la_i\).

那么每次我们更新的时候用 \(la\) 跳转即可。

然后我们发现每个数只能用和它相同的数的位置转移过来。

所以实际上这分成了若干的转移线。

然后我们发现在每条转移线上的转移点是单调的。

并且转移点更新的条件是用下一个地方转移比得到的区间价值和更大。

所以可以做到 \(O(n)\)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;static char ch;static bool flag;flag =false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
#define rg register int
#define rep(i,a,b) for(rg i=(a);i<=(b);++i)
#define per(i,a,b) for(rg i=(a);i>=(b);--i)
const int maxn = 1000010;
int c[maxn],v[maxn],ws[maxn],la[maxn];
ll s[maxn],f[maxn];int g[maxn];
int main(){
int n,m;read(n);read(m);
rep(i,1,n) read(c[i]);
rep(i,1,n) read(v[i]),s[i] = s[i-1] + v[i];
rep(i,1,n){
g[c[i]] = 0;
la[i] = ws[c[i]];
ws[c[i]] = i;
}
f[0] = 0;
rep(i,1,n){
f[i] = f[i-1];
if(la[i] != 0){
f[i] = max(f[i],f[g[c[i]]-1]+s[i]-s[g[c[i]]-1]);
if(f[i-1] - f[g[c[i]]-1] > s[i-1] - s[g[c[i]]-1]) g[c[i]] = i;
}else g[c[i]] = i;
}printf("%lld\n",f[n]);
return 0;
}

#507. 「LibreOJ NOI Round #1」接竹竿 dp的更多相关文章

  1. LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿

    二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...

  2. 「LibreOJ NOI Round #2」不等关系

    「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...

  3. 「LibreOJ NOI Round #1」验题

    麻烦的动态DP写了2天 简化题意:给树,求比给定独立集字典序大k的独立集是哪一个 主要思路: k排名都是类似二分的按位确定过程. 字典序比较本质是LCP下一位,故枚举LCP,看多出来了多少个独立集,然 ...

  4. #509. 「LibreOJ NOI Round #1」动态几何问题

    下面给出部分分做法和满分做法 有一些奇妙的方法可以拿到同样多的分数,本蒟蒻只能介绍几种常见的做法 如果您想拿18分左右,需要了解:质因数分解 如果您想拿30分左右,需要了解:一种较快的筛法 如果您想拿 ...

  5. #510. 「LibreOJ NOI Round #1」动态几何问题

    题目: 题解: 几何部分,先证明一下 \(KX = \sqrt{a},YL = \sqrt{b}\) 设左侧的圆心为 \(O\) ,连接 \(OK\) ,我们有 \(OK = r\). 然后有 \(r ...

  6. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)

    题面 传送门 题解 感谢\(@M\_sea\)的代码我总算看懂题解了-- 这个操作的本质就是每次把\(x\)的\(k\)进制最低位乘\(2\)并进位,根据基本同余芝士如果\(k\)是奇数那么最低位永远 ...

  7. LOJ 510: 「LibreOJ NOI Round #1」北校门外的回忆

    题目传送门:LOJ #510. 题意简述: 给出一个在 \(K\) 进制下的树状数组,但是它的实现有问题. 形式化地说,令 \(\mathrm{lowbit}(x)\) 为在 \(K\) 进制下的 \ ...

  8. 「LibreOJ NOI Round #2」单枪匹马

    嘟嘟嘟 这题没卡带一个\(log\)的,那么就很水了. 然后我因为好长时间没写矩阵优化dp,就只敲了一个暴力分--看来复习还是很关键的啊. 这个函数显然是从后往前递推的,那么令第\(i\)位的分子分母 ...

  9. LOJ575. 「LibreOJ NOI Round #2」不等关系 [容斥,分治FFT]

    LOJ 思路 发现既有大于又有小于比较难办,使用容斥,把大于改成任意减去小于的. 于是最后的串就长成这样:<<?<?<??<<<?<.我们把一段连续的& ...

随机推荐

  1. PHP-FPM 慢执行日志、网站隔离配置

    慢执行日志 1.配置文件下打开慢执行日志 vim /usr/local/php/etc/php-fpm.conf # 慢执行日志路径 slowlog = /path/to/slow.log # 设置超 ...

  2. QT的基本数据类型

    QT的基本数据类型(转) qint8:signed char 有符号8比特数据 qint16:signed short 16位数据类型 qint32:signed int. 32位有符号数据类型 qi ...

  3. Linux系统基本的内存管理知识讲解

    内存是Linux内核所管理的最重要的资源之一.内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量.虚拟内存就是为了克服这个矛盾而采用的策略.系统的虚拟内存通过在各个 ...

  4. cnetos升级内核玩docker

    最近在学习docker容器.在阿里云上的服务器内核版本比较低.所以,需要先升级. 查看内核命令:uname -r 升级内核,网上也有很多种方式.一般都是下载内核包,然后自己编译.不过这种方式需要注意的 ...

  5. 分享会上演示Dubbo的路由规则,结果被小坑了下

      今天公司给大家演示基于Dubbox的服务治理平台,结果因为开了vpn导致本机IP地址比较混乱,在配置路由规则的时候我这样配置条件路由 consumer.host=*.*.*.* => pro ...

  6. ZC_操作_not敲代码

    1.javah 命令(路径为 项目的bin目录下),例如 : F:\ZC_Code_E\workspace__MyEclipse2013\JNIjw01\bin>javah jniZ.JNIjw ...

  7. Java 各种锁的小结

    一. synchronized 在 JDK 1.6 之前,synchronized 是重量级锁,效率低下. 从 JDK 1.6 开始,synchronized 做了很多优化,如偏向锁.轻量级锁.自旋锁 ...

  8. jquery的50个免费插件

    说不定什么时候用到呢 http://www.admin10000.com/document/4711.html

  9. linux的一些操作

    在终端输入cat /etc/issue 查看ubuntu的半磅不知道ubuntu特权用户root的密码时:Ubuntu在默认情况下是不启用root用户的,所以这对于一下对于linux命令不熟悉的用户在 ...

  10. yii2: oralce中文,有的汉字是2个字节,有的汉字是3个字节

    yii2: oralce中文,有的汉字是2个字节,有的汉字是3个字节 请用mb_substr转成1个英文字节