[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条 ...
随机推荐
- ES6常用新特性
https://segmentfault.com/a/1190000011976770?share_user=1030000010776722 该文章为转载文章!仅个人喜好收藏文章! 1.前言 前几天 ...
- python之路--day10-闭包函数
1.命名关键字参数 格式:在*后面的参数都是命名关键字参数 特点: 1.必须被传值 2.约束函数的调用者必须按照key=value的形式传值 3.约束函数的调用者必须用我们指定的key名 def au ...
- JAVA_SE基础——38.单例设计模式
本文继续介绍23种设计模式系列之单例模式. 我们在javaSE的基础学习中,会讲到:单例设计模式.模板设计模式.装饰者设计模式.观察者设计模式.工厂设计模式 我以后随着水平的提高,我会专门开个分类写设 ...
- Python内置函数(55)——globals
英文文档: globals() Return a dictionary representing the current global symbol table. This is always the ...
- HashMap 的底层原理
1. HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1 ...
- 阿里云API网关(2)开放 API 并接入 API 网关
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- Spring Security 入门(1-6-2)Spring Security - 内置的filter顺序、自定义filter、http元素和对应的filterChain
Spring Security 的底层是通过一系列的 Filter 来管理的,每个 Filter 都有其自身的功能,而且各个 Filter 在功能上还有关联关系,所以它们的顺序也是非常重要的. 1.S ...
- 面向对象的PHP(5)
OOP的好处 封装 封装可以隐藏实现细节,使代码模块化,代码重用 继承 继承可以扩展已存在的代码模块(class),代码重用 多态 为了类在继承和派生的时候,保证实例的某一属性正确调用,接口重用 关键 ...
- python flask框架 数据库的使用
#coding:utf8 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # ...
- 翻译:JVM虚拟机规范1.7中的运行时常量池部分(一)
原文链接: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4 Java Virtual Machine i ...