题意:对于一个序列,令一个 \(melody\) 为一个子序列满足子序列的相邻两项相差 \(1\) 或者模 \(7\) 同余。现在提取四个不重合的 \(melody\),求最长总长度。

我们先考虑暴力的网络流,每个点拆成两个,中间流量 \(1\),费用 \(-1\),每个点朝着所有可以转移向的点连边。边数是 \(O(n^2)\) 的。总复杂度 \(O(n^3)\)。

我们发现,我们不一定要往所有可以转移的点连边。我们可以建立两种点,一种是“值点”,一种是“模点”。我们只是往所有的“值为 \(a_i\pm 1\) 的后缀”和所有“模 \(7\) 为 \(k\) 的后缀”连边。这些后缀连到自己所属的值。然后后缀再连到新的后缀。

但是,如果我们给每个位置都开这样的后缀,点数就会变成 \(O(n^2)\)(离散化后),反而不如原来。不过我们发现,如果位置 \(i\) 没有值为 \(x\) 的数或模 \(7\) 余 \(k\) 的数,后缀 \(x\) 和 \(k\) 就可以和 \(i+1\) 共用。

这就提示我们遇到了再对当前值的后缀更新新节点并连边。

我们记录当前值为 \(x\) 的后缀是 \(id_x\),当前模 \(7\) 余 \(x\) 的后缀是 \(ik_x\)。

首先,\(x\) 从 \(id_{a_x}\) 转移来,更新新的 \(id_{a_x}\)

然后,\(x\) 转移到 \(id_{a_x\pm1}\),更新新的 \(id_{a_x\pm1}\)

最后,\(x\) 从 \(ik_{a_x\bmod 7}\) 转移来,更新,转移到新的 \(ik_{a_x\bmod 7}\)。

因为最多提出四个子序列,我们建立虚拟源点,让一切流量从这里流出,而源点到虚拟源点连流量为 \(4\) 的边。

边数 \(O(n)\),总复杂度 \(O(n^2)\),足够通过此题。

int id[100005],ik[8],n,a[3005],cnt;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
rp(i,n)cin>>a[i];cnt=2*n+1;
Juc::s=0,Juc::t=2*n+2,cnt=2*n+2;
rep(i,0,2*n+2)Juc::ptt(i);
Juc::add(0,2*n+1,4,0);
rp(i,n){
Juc::add(2*n+1,i,1,0);
Juc::add(i+n,2*n+2,1,0);
Juc::add(i,i+n,1,-1); if(id[a[i]-1]){
++cnt;Juc::ptt(cnt);
Juc::add(id[a[i]-1],i,1,0);
Juc::add(id[a[i]-1],cnt,1e9,0);
id[a[i]-1]=cnt;
} if(id[a[i]+1]){
++cnt;Juc::ptt(cnt);
Juc::add(id[a[i]+1],i,1,0);
Juc::add(id[a[i]+1],cnt,1e9,0);
id[a[i]+1]=cnt;
} ++cnt;Juc::ptt(cnt);
if(id[a[i]]){
Juc::add(id[a[i]],cnt,1e9,0);
Juc::add(id[a[i]],i,1e9,0);
}id[a[i]]=cnt;
Juc::add(i+n,id[a[i]],1,0); ++cnt;Juc::ptt(cnt);
if(ik[a[i]%7]){
Juc::add(ik[a[i]%7],i,1,0);
Juc::add(ik[a[i]%7],cnt,1e9,0);
}
Juc::add(i+n,cnt,1,0);ik[a[i]%7]=cnt;
}
Juc::MCMF();
cout<<-Juc::cost<<endl;
return 0;
}
//Crayan_r

CF818G - Four Melody的更多相关文章

  1. Difficult Melody(映射)

    题目链接 http://vjudge.net/contest/137242#problem/D Description You're addicted to a little game called ...

  2. upc组队赛16 Melody【签到水】

    Melody 题目描述 YellowStar is versatile. One day he writes a melody A = [A1, ..., AN ], and he has a sta ...

  3. html5文章 -- 使用 jQuery Mobile 与 HTML5 开发 Web App ——开发原则 | Kayo's Melody

    最近专注研究 jQuery Mobile —— 一款很方便就可以把 Web App 包装成适合 Android 与 iPhone 等触屏移动设备的 Javascript 库,结合 jQuery Mob ...

  4. UVALive - 4026 Difficult Melody(暴力)

    我这个英语学渣又把题给翻译错了……(话说,六级差十分没有过,好心疼T T),题目中说的P和Q都是计算game的个数,我以为是出现的次数,各种wa..后来调整了以后又是各种wa,原来是double型的数 ...

  5. LightOJ 1428 Melody Comparison (KMP + 后缀数组)

    题意:给定两个串A,B,问你A有多少不同的子串,并且不包含B. 析:首先A有多少个不同的子串,可以用后缀数组来解决,也就是 n - sa[i] - h[i] + 1.但是要是不包含B,可以先预处理A和 ...

  6. 详解树莓派Model B+控制蜂鸣器演奏乐曲

    步进电机以及无源蜂鸣器这些都需要脉冲信号才能够驱动,这里将用GPIO的PWM接口驱动无源蜂鸣器弹奏乐曲,本文基于树莓派Mode B+,其他版本树莓派实现时需参照相关资料进行修改! 1 预备知识 1.1 ...

  7. POJ1743 Musical Theme [后缀数组]

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 27539   Accepted: 9290 De ...

  8. PHP资源列表

    一个PHP资源列表,内容包括:库.框架.模板.安全.代码分析.日志.第三方库.配置工具.Web 工具.书籍.电子书.经典博文等等. 初始翻译信息来自:<推荐!国外程序员整理的 PHP 资源大全& ...

  9. 用Tensorflow让神经网络自动创造音乐

    #————————————————————————本文禁止转载,禁止用于各类讲座及ppt中,违者必究————————————————————————# 前几天看到一个有意思的分享,大意是讲如何用Ten ...

  10. PHP错误以及异常处理

    以前一直觉得php的异常处理没有什么,现在才发现这个还真是门学问,于是狠下心来好好研究了一下,写一篇文章,也作备忘吧. 1. php错误 无论是什么语言编程,都会有如下三种错误,当然php也不例外. ...

随机推荐

  1. 全都会!预测蛋白质标注!创建讲义!解释数学公式!最懂科学的智能NLP模型Galactica尝鲜 ⛵

    作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 深度学习实战系列:https://www.showmeai.tech/t ...

  2. 自己动手基于 Redis 实现一个 .NET 的分布式锁

    分布式锁的核心其实就是采用一个集中式的服务,然后多个应用节点进行抢占式锁定来进行实现,今天介绍如何采用Redis作为基础服务,实现一个分布式锁的类库,本方案不考虑 Redis 集群多节点问题,如果引入 ...

  3. Django中ORM多对多三种创建方式(全自动-纯手动-半自动)

    一:多对多三种创建方式 1.全自动: 利用orm自动帮我们创建第三张关系表 class Book(models.Model): name = models.CharField(max_length=3 ...

  4. 【机器学习】李宏毅——Recurrent Neural Network(循环神经网络)

    假设我们当前要做一个人工智能客服系统,那该系统就需要对用户输入的话语进行辨认,例如用户输入: I want to arrive Taipei on November 2nd 那么该系统就能够辨认出来T ...

  5. Jmeter 之 switch 控制器

    switch 控制器作用: switch 控制器起到了分流作用,具体应用在并发时,一部分用户执行某个场景,一部分用户执行另外一种场景,就像吞吐量控制器进行分流操作 switch 控制器字段介绍: 实例 ...

  6. 主题 1 The Shell

    主题 1 The Shell 课程概览与 shell · the missing semester of your cs education (missing-semester-cn.github.i ...

  7. [python]《Python编程快速上手:让繁琐工作自动化》学习笔记5

    1. 处理CSV文件笔记(第14章) (代码下载) 本文主要在python下介绍CSV文件,CSV 表示"Comma-Separated Values(逗号分隔的值)",CSV文件 ...

  8. 【Redis技术探索】「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数据实战指南(在线同步数据)

    从实战出发使用RedisShake进行Redis数据在线+离线模式迁移指南 RedisShake基本介绍 RedisShake是基于redis-port基础上进行改进的是一款开源的Redis迁移工具, ...

  9. C# lock 、 Monitor Wait、Pulse和PulseAll 的区别和用法(转载)

    1.Monitor.Wait方法当线程调用 Wait 时,它释放对象的锁并进入对象的等待队列,对象的就绪队列中的下一个线程(如果有)获取锁并拥有对对象的独占使用.Wait()就是交出锁的使用权,使线程 ...

  10. 算法之Floyd-Warshall算法【c++】【图论】【最短路】

    我们作为刚学图论的小蒟蒻,先接触到的算法一定是图上最短路径算法.而最短路算法中最简单的当属Floyd-Warshall算法.下面是一些基本介绍: ​该算法可以计算图上任意两点间的最短路径 时间复杂度: ...