[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条 ...
随机推荐
- nyoj 数的长度
描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)? 输入 首行输入n,表示有多少组测试数据(n<1 ...
- vue 在methods中调用mounted中的方法?
首先可以在data中先声明一个变量 比如 isShow=' ' mounted 中 ---> methods 中 ---> this.sureDelBox(item) 直接this调用 ...
- Hadoop完全分布式安装教程
一.软件版本 Hadoop版本号:hadoop-2.6.0.tar: VMWare版本号:VMware-workstation-full-11.0.0-2305329 Ubuntu版本号:ubuntu ...
- ELK学习总结(1-3)倒排索引
1.倒排索引(反向索引) 一种索引方法,用来存储在全文检索下某个单词在一个/组文档中的存储位置. 常规索引,文档->关键词,费时,得把一个文档全部遍历一遍 倒排索引,关键词->文档,全文搜 ...
- windows计划任务
前段时间写了一个小工具,实现两个数据库的数据同步. 需求:要求每天的某个时间自动同步数据 功能写好之后,发现了windows一个自带的功能不错,可以实现我的需要,不用写定时器触发了 控制面板-> ...
- mangodb的基本操作:增删改差
MongoDB三元素: 1 数据库: 和关系型数据库中数据库的层次相同,内部可以有多个集合. 2 集合: 相当于关系型数据库中的表,存储若干文档,结构不固定 3 文档: 相当于关系型数据库中的行,是J ...
- linux下Tab及shell 补全python
Python自动补全 Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. vim python自动补全插件:pydiction 可以实现下 ...
- Java面试题—中级(中)
什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行.当线程进入对象的synchro ...
- maven项目添加db2的jar包
安装完DB2后,SQLLIB文件夹下的java目录下有对应的jar包,我的SQLLIB文件夹位置在 D:\Program Files\IBM\SQLLIB\java 处. 此目录直接添加到CLASSP ...
- [LeetCode] Design Compressed String Iterator 设计压缩字符串的迭代器
Design and implement a data structure for a compressed string iterator. It should support the follow ...