[APIO2008]
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]的更多相关文章
- [BZOJ3624][Apio2008]免费道路
[BZOJ3624][Apio2008]免费道路 试题描述 输入 输出 输入示例 输出示例 数据规模及约定 见“输入”. 题解 第一步,先尽量加入 c = 1 的边,若未形成一个连通块,则得到必须加入 ...
- bzoj 3624: [Apio2008]免费道路 生成树的构造
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 111 Solved: 4 ...
- 题解 Luogu P3623 [APIO2008]免费道路
[APIO2008]免费道路 题目描述 新亚(New Asia)王国有 N 个村庄,由 M 条道路连接.其中一些道路是鹅卵石路,而其它道路是水泥路.保持道路免费运行需要一大笔费用,并且看上去 王国不可 ...
- BZOJ 3624: [Apio2008]免费道路
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1201 Solved: ...
- 4606: [Apio2008]DNA
4606: [Apio2008]DNA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 63 Solved: 36[Submit][Status][D ...
- [Apio2008]免费道路[Kruscal]
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1292 Solved: ...
- P3623 [APIO2008]免费道路
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special Judge Submit: 2143 Solved: 88 ...
- 【BZOJ4606】[Apio2008]DNA DP
[BZOJ4606][Apio2008]DNA Description 分析如DNA序列这样的生命科学数据是计算机的一个有趣应用.从生物学的角度上说,DNA 是一种由腺嘌呤.胞嘧啶.鸟嘌呤和胸腺嘧啶这 ...
- Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路
首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...
- [APIO2008]免费道路
[APIO2008]免费道路 BZOJ luogu 先把必须连的鹅卵石路连上,大于k条no solution 什么样的鹅卵石路(u,v)必须连?所有水泥路都连上仍然不能使u,v连通的必须连 补全到k条 ...
随机推荐
- MobileNet_v2
研究动机: 神经网络彻底改变了机器智能的许多领域,实现了超人的准确性.然而,提高准确性的驱动力往往需要付出代价:现代先进网络需要高度计算资源,超出许多移动和嵌入式应用的能力. 主要贡献: 发明了一个新 ...
- 《javascript设计模式与开发实践》阅读笔记(13)—— 职责链模式
职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 书里的订单的例子 假设我们负责一个售卖手机 ...
- centos7 编译安装greenplum5.7
一.配置系统 安装是以一个主节点,三个子节点进行安装.gp是在github上下载的5.7的源码.地址https://github.com/greenplum-db/gpdb/tree/5.7.0. 1 ...
- MYSQL中group_concat有长度限制!默认1024
在mysql中,有个函数叫"group_concat",平常使用可能发现不了问题,在处理大数据的时候,会发现内容被截取了,其实MYSQL内部对这个是有设置的,默认不设置的长度是10 ...
- Linq 巧用 Max,Sum
IList<, , , , , }; var sum1 = intList.Sum(s => { == ) { return s; } ; }); Console.WriteLine(&q ...
- 增加Linux虚拟机的硬盘空间
原配置为40G,现需要增加到60G,操作方法如下: 一.虚拟机关机,在编辑设置里调整硬盘空间到60G 二.虚拟机开机,扩展硬盘空间 1.安装gparted,命令如下 sudo apt-get inst ...
- Mego开发文档 - 基本保存操作
基本保存操作 在Mego中没有更改跟踪,也就是说所有的新增.更新及删除都需要开发者自行判断.Mego会最为实际的将各个数据操作提交给数据库并执行. 添加数据 using (var db = new O ...
- vue组件详解(四)——使用slot分发内容
一.什么是slot 在使用组件时,我们常常要像这样组合它们: <app> <app-header></app-header> <app-footer>& ...
- SpringCloud的应用发布(四)vmvare+linux,防火墙和selinux
一.vmvare网络配置为nat模式 二.vmvare的网络设置为桥接bridge模式 1.linux 网卡的ip获取方式dhcp 三.关闭linux的防火墙和selinux 1.临时关闭防火墙 sy ...
- VCS使用学习笔记(0)——写在前面的话
由于毕业设计做的是数字IC相关,虽然不是纯设计,但是也有设计相关.有设计就要有仿真验证,我就趁此机会来学习一下VCS的使用吧.当然,这里只是学习其简单的逻辑仿真功能,从波形仿真到覆盖率等,基本上不涉其 ...