A.免费道路roads

题意:给定n个点m条边的图,边有黑白颜色,求是否有一个生成树满足恰好有K条黑边,并输出方案。

题解:先加白边,求出必须加的黑边,然后加黑边到K条,剩下的用白边填充。

顺便说说,边权只有01的图,生成树的权值和可以取到任意的介于[MST,MBT]的任意值,其中MST表示最小生成树,MBT最大。

我们可以发现MST和MBT的区别在与其中一些点,这些点与生成树联通的边可以选择0或者1,所以你可以把一些点的边替换,每次权值变化1,所以可以取到任意的权值.

#include<iostream>
#include<cstdio>
#include<cstring>
#define MN 20000
#define MM 100000
using namespace std;
inline int read()
{
int x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} struct edge{int from,to;}e[MM+],e2[MM+];
int n,m,K,s[MN+],cnt1=,cnt2=,q[MN+],qx[MN+],top,top2; int getfa(int x){return !s[x]?x:s[x]=getfa(s[x]);} int kruscal(edge*E,int num,int lim=MM)
{
top=;
for(int i=;i<=num&&top<lim;i++)
{
int x=getfa(E[i].from),y=getfa(E[i].to);
if(x!=y)
s[x]=y,q[++top]=i;
}
return top;
} int main()
{
n=read();m=read();K=read();
for(int i=;i<=m;i++)
{
int u=read(),v=read(),k=read();
if(!k) e[++cnt1]=(edge){u,v};
else e2[++cnt2]=(edge){u,v};
}
int num1=kruscal(e2,cnt2),num2=kruscal(e,cnt1);
if(num2>K||cnt1<K||num1+num2!=n-) return *puts("no solution");
memset(s,,sizeof(s));top2=top;
for(int i=;i<=top;i++)
qx[i]=q[i],s[getfa(e[q[i]].from)]=getfa(e[q[i]].to);
if(kruscal(e,cnt1,K-num2)<K-num2) return *puts("no solution");
for(int i=;i<=top2;i++)printf("%d %d %d\n",e[qx[i]].from,e[qx[i]].to,);
for(int i=;i<=top;i++)
printf("%d %d %d\n",e[q[i]].from,e[q[i]].to,);
kruscal(e2,cnt2);
for(int i=;i<=top;i++)
printf("%d %d %d\n",e2[q[i]].from,e2[q[i]].to,);
return ;
}

B.DNA

给定一个长度为m的由ACGTN组成的字符串,定义大小关系A<C<G<T,你要把其中的N替换成ACGT的其中一个,满足最多有k个不下降的子序列的同时,求出第R大的字符串。

$m\leqslant 50000 R\leqslant 10^{12} k\leqslant 10$

题解:用f[i][j][k]表示第i到n位第i位是k,这部分分了j段的个数,这个容易转移,然后我们就一步步走呗。复杂度 O(16mk)

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
inline ll read()
{
ll x = , f = ; char ch = getchar();
while(ch < '' || ch > ''){ if(ch == '-') f = -; ch = getchar();}
while(ch >= '' && ch <= ''){x = x * + ch - '';ch = getchar();}
return x * f;
} ll f[][][];
int m,K,s[];ll R;
char st[];
char ch[]={'A','C','G','T'}; int main()
{
m=read();K=read();R=read();
scanf("%s",st+);
for(int i=;i<=m;i++)
{
if(st[i]=='A') s[i]=;
else if(st[i]=='C') s[i]=;
else if(st[i]=='G') s[i]=;
else if(st[i]=='T') s[i]=;
else s[i]=;
}
if(s[m]) f[m][][s[m]]=;
else f[m][][]=f[m][][]=f[m][][]=f[m][][]=;
for(int i=m-;i;i--)
for(int j=;j<=K;j++)
for(int k=;k<=;k++)
if(!s[i]||s[i]==k)
for(int l=;l<=;l++)
{
if(k<=l) f[i][j][k]+=f[i+][j][l];
else f[i][j][k]+=f[i+][j-][l];
}
for(int i=;i<=m;i++)
for(int k=;k<=;k++)
for(int j=;j<=K;j++)
f[i][j][k]+=f[i][j-][k];
for(int i=,k=;i<=m;i++)
if(s[i])
{
printf("%c",st[i]);
if(s[i]<k)--K;k=s[i];
}
else
{
for(int j=;j<=;j++)
if(f[i][K-(j<k)][j]<R)
R-=f[i][K-(j<k)][j];
else
{
printf("%c",ch[j-]);
if(j<k) --K;k=j;
break;
}
}
return ;
}

[APIO2008]的更多相关文章

  1. [BZOJ3624][Apio2008]免费道路

    [BZOJ3624][Apio2008]免费道路 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入”. 题解 第一步,先尽量加入 c = 1 的边,若未形成一个连通块,则得到必须加入 ...

  2. bzoj 3624: [Apio2008]免费道路 生成树的构造

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 111  Solved: 4 ...

  3. 题解 Luogu P3623 [APIO2008]免费道路

    [APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...

  4. BZOJ 3624: [Apio2008]免费道路

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1201  Solved:  ...

  5. 4606: [Apio2008]DNA

    4606: [Apio2008]DNA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 63  Solved: 36[Submit][Status][D ...

  6. [Apio2008]免费道路[Kruscal]

    3624: [Apio2008]免费道路 Time Limit: 2 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1292  Solved:  ...

  7. P3623 [APIO2008]免费道路

    3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special Judge Submit: 2143 Solved: 88 ...

  8. 【BZOJ4606】[Apio2008]DNA DP

    [BZOJ4606][Apio2008]DNA Description 分析如DNA序列这样的生命科学数据是计算机的一个有趣应用.从生物学的角度上说,DNA 是一种由腺嘌呤.胞嘧啶.鸟嘌呤和胸腺嘧啶这 ...

  9. Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路

    首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...

  10. [APIO2008]免费道路

    [APIO2008]免费道路 BZOJ luogu 先把必须连的鹅卵石路连上,大于k条no solution 什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连 补全到k条 ...

随机推荐

  1. 要学好JAVA要注意些什么?

    从自学开始到参加系统的学习JAVA已经差不多有1个月了的时间了,在这段时间以前我也和很多人一样在网上盲目的搜罗一些视频来自己啃,随着时间的积累,对JAVA的认识也有了一定的提升,之前可能因为在IT咨询 ...

  2. windows 10下通过python3.6成功搭建jupyter 服务器

    最近通过python学习爬虫技术,发现一个工具jupyter notebook很不错,该工具明显优势通过浏览器可以输入多行python代码,支持在线运行以及运行结果保存功能,在线验证python小模块 ...

  3. mysql常用命令整理

    #不压缩备份 mysqldump -u root -p userpassword databasename > /tmp/backupfile.sql #压缩备份 mysqldump -u ro ...

  4. Linq SelectMany 交叉连接

    class Student1 { public int Score { get; set; } public Student1(int score) { this.Score = score; } } ...

  5. Java 10 的 10 个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  6. kubernetes入门(01)kubernetes是什么?

    一.kubernetes是什么? Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以 ...

  7. Mac里安装Jmeter

    前提是需要安装jdk,参见http://www.cnblogs.com/fun0623/p/4703456.html 1.解压包 (双击apache-jmeter-2.13) 2.进去到解压后的bin ...

  8. Python入门之PyCharm的快捷键与常用设置和扩展(Mac系统)

    1. 快捷键 2 . PyCharm的常用设置和扩展 ------------------------------------------------------------------------- ...

  9. 高级控件 popwindow 与gridview的组合应用

    Gridview 的布局设置 <GridView android:layout_width="wrap_content" android:layout_height=&quo ...

  10. Docker学习(1)安装

    1. Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱 ...