BZOJ4607 : [PA2015 Final]Edycja
显然做完操作$2$后再做操作$1$。
建立一个$26$个点的有向图,每个点只有一条出边,$i$->$j$表示$i$最终变成了$j$,边权为一开始是$i$,最后不是$j$的位置个数,如果$i\neq j$,则代价还要增加$c$。
对于每个点贪心选取最小的出边,如果没有环,那么此时就是最优解。
否则,对于一个连通块,如果它是环,那么需要多付出$c$点代价,而且如果所有连通块都是环或者孤立点,则不可能构造出这种图。
考虑重新决定每个点的出边,如果出现了原来贪心构造出的图中不存在的环,那么一定有一个点的出边和一开始不同,因为一开始是贪心选最小,因此把那条边改回最开始的出边,答案不会增加,而且新环被破坏了。因此对于不是原来中的图的环,一定存在一种方案与它代价相同,且不存在这个环。
于是设$f[i][S][j]$表示考虑了前$i$个字符,$S$集合的环已经被破坏,是否和原图一样为$j$时边权的最小值,DP即可。
因为最多只有$13$个环,所以时间复杂度为$O(n+26^2\times2^{13})$。
#include<cstdio>
const int N=26,M=1000010,inf=~0U>>1;
int n,c,m,flag,i,j,k,S,U,v[N][N],ap[N],w[N][N],g[N],fa[N],d[N],vis[N],del[N],id[N];
int f[N+1][1<<(N/2)][2],ans;char a[M],b[M];
int F(int x){return fa[x]==x?x:fa[x]=F(fa[x]);}
inline void up(int&a,int b){if(a>b)a=b;}
int main(){
scanf("%d%d%s%s",&n,&c,a,b);
for(i=0;i<n;i++)v[a[i]-'a'][b[i]-'a']++,ap[a[i]-'a']++;
for(i=0;i<N;i++)for(j=0;j<N;j++){
w[i][j]=ap[i]-v[i][j];
if(i!=j)w[i][j]+=c;
}
for(i=0;i<N;i++)fa[i]=i,id[i]=-1;
for(i=0;i<N;i++){
for(k=j=0;j<N;j++)if(w[i][j]<w[i][k])k=j;
d[g[i]=k]++;
if(F(i)!=F(k))fa[fa[i]]=fa[k];
}
for(i=0;i<N;i++)if(!del[F(i)]){
del[fa[i]]=vis[i]=1;
for(j=g[i];!vis[j];j=g[j])vis[j]=1;
if(g[j]==j)continue;
for(id[j]=m,k=g[j];k!=j;k=g[k])id[k]=m;
m++;
}
if(!m){
for(i=0;i<N;i++)ans+=w[i][g[i]];
return printf("%d",ans),0;
}
for(flag=1,i=0;i<N;i++)if(d[i]!=1)flag=0;
for(i=0;i<=N;i++)for(S=0;S<1<<m;S++)for(j=0;j<2;j++)f[i][S][j]=inf;
f[0][0][0]=0;
for(i=0;i<N;i++)for(S=0;S<1<<m;S++)for(j=0;j<2;j++)if(f[i][S][j]<inf)for(k=0;k<N;k++){
U=S;
if(~id[i]&&k!=g[i])U|=1<<id[i];
if(~id[k]&&(k!=g[i]||id[i]!=id[k]))U|=1<<id[k];
up(f[i+1][U][j||k!=g[i]],f[i][S][j]+w[i][k]);
}
for(ans=inf,S=0;S<1<<m;S++)for(j=flag;j<2;j++)if(f[N][S][j]<inf)up(ans,f[N][S][j]+(m-__builtin_popcount(S))*c);
return printf("%d",ans),0;
}
BZOJ4607 : [PA2015 Final]Edycja的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- java抽象、接口 和final
抽象 一.抽象类:不知道是具体什么东西的类. abstract class 类名 1.抽象类不能直接new出来. 2.抽象类可以没有抽象方法. public abstract class USB { ...
- Java内部类final语义实现
本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...
- Java关键字final、static
一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...
- JavaSE 之 final 初探
我们先看一道面试题: 请问 final 的含义是什么?可以用在哪里?其初始化的方式有哪些? 首先我们回答一下这道题,然后再探究其所以然. 1.final 表示“最终的”.“不可改变的”,意指其修饰类 ...
- PHP的final关键字、static关键字、const关键字
在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...
- final修饰符
final本身的含义是"最终的,不可变的",它可以修饰非抽象类,非抽象方法和变量.注意:构造方法不能使用final修饰,因为构造方法不能被继承,肯定是最终的. final修饰的类: ...
- 浅析Java中的final关键字(转载)
自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...
- java关键字extends(继承)、Supe(父类引用空间)、 This(方法调用者对象)、Instanceof(实例类型-判断对象是否属于某个类)、final(最终)、abstract(抽象) 、interface(接口)0
java 继承使用关键字extends 继承的作用:减少代码量,优化代码 继承的使用注意点: 1子类不能继承父类的私有变量 2.子类不能继承父类的构造方法 3.子类在调用自己的构造方法时 会默认调 ...
随机推荐
- Android Hybrid开发
参考:谈谈Android App混合开发 Html 5和Native的交互 WebView 本来就支持js和Java相互调用,你只需要开启 WebView 的JavaScript脚本执行, 然后通过代 ...
- android 屏幕旋转
转自:http://blog.csdn.net/oyzhizhong/article/details/8131799 屏是LANDSCAPE的,要让它默认显示为PORTRAIT. 1.kernel里要 ...
- Delphi操作XML简介
参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...
- Validform 学习笔记---基础知识整理
面对表单的验证,自己写大量的js毕竟不是一个明智的做法.不仅仅是代码很长而且不便于梳理.Validform就是一款开源的第三方验证js的控件,通过添加相应的js以及css能够有效的验证表单,维护起来也 ...
- AOJ789 买酒
买酒 Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MBTotal Submission: 70 Submis ...
- Install Docker on Mac OS X(转)
Install Docker on Mac OS X You can install Docker using Boot2Docker to run docker commands at your c ...
- 如何实现Outlook 2010 下载邮件后自动删除服务器上的邮件
outlook2010---文件---信息---账户设置---选中要设置的帐号---双击点选要设置的邮箱---其他设置---高级---在服务器上保留邮件的副本---14天后删除服务器上的邮件副本,修改 ...
- loj 1210 (求最少的加边数使得图变成强连通)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1210 思路:首先是缩点染色,然后重建并且统计新图中的每个点的入度和出度,于是答案就是m ...
- 孙鑫VC学习笔记:多线程编程
孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010 HQU Email:zgzhaobo@gmail.com QQ:452728574 Latest Modified ...
- windows mysql 自动备份的几种方法
转自:http://www.cnblogs.com/liongis/archive/2013/03/12/2956573.html 1.复制date文件夹备份===================== ...