【bzoj2935】【Poi1999】原始生物

2935: [Poi1999]原始生物

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 145  Solved: 71
[Submit][Status][Discuss]

Description

原始生物的遗传密码是一个自然数的序列K=(a1,...,an)。原始生物的特征是指在遗传密码中连续出现的数对(l,r),即存在自然数i使得l=ai且r=ai+1。在原始生物的遗传密码中不存在(p,p)形式的特征。

求解任务:

请设计一个程序:

·读入一系列的特征。

·计算包含这些特征的最短的遗传密码。

·将结果输出

Input

第一行是一个整数n ,表示特征的总数。在接下来的n行里,每行都是一对由空格分隔的自然数l 和r ,1 <= l,r <= 1000。数对(l, r)是原始生物的特征之一。输入文件中的特征不会有重复。

Output

唯一一行应该包含一个整数,等于包含了PIE.IN中所有特征的遗传密码的最小长度。

Sample Input

12

2 3

3 9

9 6

8 5

5 7

7 6

4 5

5 1

1 4

4 2

2 8

8 6

Sample Output

15

注:

PIE.IN中的所有特征都包含在以下遗传密码中:

(8, 5, 1, 4, 2, 3, 9, 6, 4, 5, 7, 6, 2, 8, 6)

HINT

Source

(话说我NOIP考前为什么要刷这种毒瘤题啊……)

题意:

给定一个有向图,求最少添加多少条边使得该图成为一个欧拉路径。输出欧拉路径上的总点数(具体参考样例)。

题解:

首先考虑简单情况,即这个图的基图是联通的情况。(基图:把有向图的边当成无向边重连出来的图)

若该图是一个欧拉回路,此时总点数等于总边数+1。(从一个点开始绕一圈还要回到该点,起点多遍历一次)

否则除了起点和终点,所有点的入度都应该等于出度,那么对于一个点$u$,它在欧拉路径上出现的次数就应该等于$max\{in(u),out(u)\}$。

推广到该图的基图是若干个联通块的情况,只需要对每个联通块求和即可。(每个联通块内的点数对其他块没有影响)

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;
#define MAXN 1000005
#define MAXM 5000005
#define INF 0x7fffffff
#define ll long long

int hd[MAXN],to[MAXM<<1];
int nxt[MAXM<<1],cnt,tot;
int in[MAXN],out[MAXN];
bool vis[MAXN],has[MAXN];
bool isr[MAXN];

inline int read(){
    int x=0,f=1;
    char c=getchar();
    for(;!isdigit(c);c=getchar())
        if(c==‘-‘)
            f=-1;
    for(;isdigit(c);c=getchar())
        x=x*10+c-‘0‘;
    return x*f;
}

inline void addedge(int u,int v){
    to[++cnt]=v,nxt[cnt]=hd[u];
    hd[u]=cnt;return;
}

inline void dfs(int u){
    vis[u]=1;
    if(in[u]!=out[u]) isr[tot]=0;
    for(int i=hd[u];i;i=nxt[i])
        if(!vis[to[i]])
            dfs(to[i]);
    return;
}

int main(){
    int N=0,M=read();
    for(int i=1;i<=M;i++){
        int u=read(),v=read();
        addedge(u,v),addedge(v,u);
        has[u]=has[v]=1;
        in[v]++,out[u]++;
        N=max(N,max(u,v));
    }
    for(int i=1;i<=N;i++)
        if(has[i] && !vis[i])
            isr[++tot]=1,dfs(i);
    int ans=0;
    for(int i=1;i<=N;i++)
        if(has[i])
            ans+=max(in[i],out[i]);
    for(int i=1;i<=tot;i++)
        ans+=isr[i];
    printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/YSFAC/p/9919844.html

时间: 2024-10-18 04:34:36

【bzoj2935】【Poi1999】原始生物的相关文章

bzoj2935 [Poi1999]原始生物——欧拉回路

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2935 考察欧拉回路性质的题目呢: TJ:https://blog.csdn.net/u014609452/article/details/53705451 首先按照题目给出的点对连边,发现能一连串输出的数组成一条路径: 那么答案就是图的最小路径覆盖的点数,可以考虑欧拉回路: 连通块之间分别考虑,如果连通块存在欧拉回路,那么覆盖它需要边数+1的点: 如果不存在欧拉回路,那么加上 度数绝对值和

BZOJ 2929: [Poi1999]洞穴攀行

2929: [Poi1999]洞穴攀行 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 351  Solved: 195[Submit][Status][Discuss] Description 洞穴学者在Byte Mountain的Grate Cave里组织了一次训练.训练中,每一位洞穴学者要从最高的一个室到达最底下的一个室.他们只能向下走.一条路上每一个连续的室都要比它的前一个低.此外,每一个洞穴学者都要从最高的室出发,沿不同的路走到最低的室.

2929: [Poi1999]洞穴攀行

2929: [Poi1999]洞穴攀行 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 41[Submit][Status][Discuss] Description 一队洞穴学者在Byte Mountain的Grate Cave里组织了一次训练.训练中,每一位洞穴学者要从最高的一个室到达最底下的一个室.他们只能向下走.一条路上每一个连续的室都要比它的前一个低.此外,每一个洞穴学者都要从最高的室出发,沿不同的路走到最低的室.问

BZOJ2929 [Poi1999]洞穴攀行

我说这题怎么看着觉得怪怪的... PoPoQQQ给出了解答:"给定一个有向图,与起点和终点相连的边只能走一次,剩下的边可以走无数次,问起点到终点可以走多少个人" 题目翻译错了233 好了,那不就是裸的网络流了吗? 1 /************************************************************** 2 Problem: 2929 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time

BZOJ 2927 POI1999 多边形之战 博弈论

题目大意:给定一个凸多边形的三角剖分,其中一个三角形被涂成了黑色,每次可以割一刀割下一个三角形,割下黑色三角形的人胜利,求是否先手必胜 这傻逼题我想了50min...50min! 把这个图转对偶图之后会变成一棵树... 问题转化成了给定一棵树有一个黑色节点每次删除一个叶节点,删除黑色节点的人胜利 如果黑色节点初始就是一个叶节点,那么先手必胜 否则当一个人面临一个黑色节点连接两个白色节点的状态时必败,而没有人会考虑越过这个状态(一旦让黑色只连接一个白色节点的话对方就直接赢了),因此答案只与n的奇偶

[bzoj2932][POI1999]树的染色问题

被百度搜到的题解(论文?)坑了. 写的那玩意好像石乐志... Description 一棵二叉树采用以下规则描述: 1.如果一个节点度数为0,则仅用一个元素"0"来描述它. 2.如果一个节点度数为1,则对它的描述以"1"开头,后面接着对它的孩子的描述. 3.如果一个节点度数为2,则对它的描述以"2"开头,后面接着的首先是它的左孩子的描述,然后是右孩子的描述. 在树中每一个节点必须被着为红色.绿色或蓝色.然而,我们必须遵循如下规定: 1.根点和它的

cogs [POI1999] 位图

★   输入文件:bit.in   输出文件:bit.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述 ] 给定一个 n*m 的矩形位图,位图中的每个像素不是白色就是黑色,但至少有一个是白色的.第 i 行.第 j 列的像素被称作像素 (i, j) .两个像素 p1 = (i1, j1) , p2 = (i2, j2) 之间的距离定义为: d(p1, p2) = |i1 - i2| + |j1 - j2|. [任务 ] 编一个程序完成以下操作: 1 .从输入文件中读入

BZOJ2934 : [Poi1999]祭坛问题

对于每个祭坛,算出每条线段阻碍它的角度区间,然后排序求并看看是否有空位即可,时间复杂度$O(n^2\log n)$. 这题在Main上官方时限是0.2S,因此需要几个常数优化: $1.$为了避免用atan2(y,x)算角度,改成算斜率,所以需要分$4$个方向讨论. $2.$对区间排序时,不要直接对结构体排序,而是对其指针排序. $3.$在计算某个祭坛时,除了它本身需要特别计算之外,其它祭坛可以直接看成没有缺口的矩形,可以减少$n$个事件. $4.$在计算的过程中,不断收缩左右边界,当左右边界重合

[bzoj2574] [Poi1999]Store-Keeper

坑啊.. 膜了半天byvoid大爷的题解.https://www.byvoid.com/blog/poi-1999-mag/?replytocom=1335/ 一开始从人的位置bfs一波,看看能走到初始包裹哪些方向上.要注意不能穿过初始包裹...byvoid的标程在处理穿过包裹什么的地方有问题...但数据略弱. 之后如题解所述. 发现自己不会求点双连通分量QAQ..那部分就抄标程了... 1 #include<cstdio> 2 #include<iostream> 3 #incl