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. 《javascript设计模式与开发实践》阅读笔记(10)—— 组合模式

    组合模式:一些子对象组成一个父对象,子对象本身也可能是由一些孙对象组成. 有点类似树形结构的意思,这里举一个包含命令模式的例子 var list=function(){ //创建接口对象的函数 ret ...

  2. HTML5 拖放(Drag 和 Drop)详解与实例(转)

    公司要开一个技术分享会,给我们出了几个简单的题去实现,其中有如何实现表格中列之间的拖拽,我知道html5中有个新方法可以实现,但是没有认真学习,现在闲了去学学,发现关于drag和drop的文章有很多, ...

  3. 浏览器端类EXCEL表格插件 版本更新 - 智表ZCELL产品V1.1.0.1版本发布

    智表(ZCELL),浏览器下纯JS表格控件,为您提供EXCEL般的智能体验! 纯国产化.高性价比的可靠解决方案. 更新说明     让大家久等了.因为最近忙其他项目,发布时间稍有延迟.  下次版本更新 ...

  4. thinkphp框架调用类不存在的方法

    thinkphp框架调用类不存在的方法调用类不存在的方法,不会报错,但是也不会执行,这是根据tp框架里面的一个魔术方法,框架里面一共才十几个魔术方法

  5. js window

    window对象: browser object mode :bom对象. bom提供了独立于内容而与浏览器窗口进行交互的对象. bom主要用于管理窗口与窗口之间的通讯,因此其核心对象是window ...

  6. Linq 集合操作符 Except,Intersect,Union

    IList<string> s1 = new List<string>() { "One", "Two", "Three&qu ...

  7. hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(1)安装jdk

    一.文件准备 下载jdk-8u131-linux-x64.tar.gz 二.工具准备 2.1 Xshell 2.2 Xftp 三.操作步骤 3.1 解压文件: $ tar zxvf jdk-8u131 ...

  8. GridControl的常用操作

    1.GridView的回车跳转单元格和换行 private void gridView1_KeyPress(object sender, KeyPressEventArgs e)        {   ...

  9. centOs6.5配置jdk及其注意事项

    1.下载jdk1.7 百度云链接: https://pan.baidu.com/s/15vXLO2eV18eVvmt-R5jGnQ 密码: 1gd6 2.解压压缩包 通过终端在/usr/local下新 ...

  10. mysql(2)—— 由笛卡尔积现象分析数据库表的连接

    首先,先简单解释一下笛卡尔积. 现在,我们有两个集合A和B. A = {0,1}     B = {2,3,4} 集合 A×B 和 B×A的结果集就可以分别表示为以下这种形式: A×B = {(0,2 ...