CodeForces615B-Longtail Hedgehog-dp/图

记忆化数组记录从这个点的最长下降序列,然后乘以这个点的度,就是ans,维护即可。

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

using namespace std;

const int maxn = 1e5+10;
const int maxm = 4e5+100;
int N,M;

struct Edge{
    int to,next;
}edge[maxm];

int NE,head[maxn],mem[maxn],chd[maxn];
long long ans;

int add_edge(int u,int v)
{
    edge[NE].to = v;
    edge[NE].next = head[u];
    head[u] = NE++;
    chd[u]++;

    edge[NE].to = u;
    edge[NE].next = head[v];
    head[v] = NE++;
    chd[v]++;
}

long long dfs(int u)
{
    if(mem[u] != -1) {ans = max((long long)chd[u]*mem[u],ans);return mem[u];}
    mem[u] = 1;
    for(int i=head[u];~i;i=edge[i].next)
    {
        int v = edge[i].to;
        if(v > u) continue;
        mem[u] = max((long long)mem[u],dfs(v)+1);
    }

    ans = max((long long)mem[u] * chd[u],ans);
    return mem[u];
}

int main()
{
    scanf("%d%d",&N,&M);
    memset(head,-1,sizeof head);
    memset(mem,-1,sizeof mem);

    for(int i=0,u,v;i<M;i++)
    {
        scanf("%d%d",&u,&v);
        add_edge(u,v);
    }

    for(int i=1;i<=N;i++) dfs(i);

    printf("%I64d\n",ans);
}
时间: 2025-01-05 05:47:02

CodeForces615B-Longtail Hedgehog-dp/图的相关文章

Codeforces Round #338 (Div. 2) B. Longtail Hedgehog 记忆化搜索/树DP

B. Longtail Hedgehog This Christmas Santa gave Masha a magic picture and a pencil. The picture consists of n points connected by m segments (they might cross in any way, that doesn't matter). No two segments connect the same pair of points, and no se

hdu 5001 概率DP 图上的DP

http://acm.hdu.edu.cn/showproblem.php?pid=5001 当时一看是图上的就跪了 不敢写,也没退出来DP方程 感觉区域赛的题  一则有一个点难以想到 二则就是编码有点难度. 这个题: 我一直的思路就是1-能到达i的概率 就是不能到达i的概率,然后三维方程巴拉巴拉,,,,把自己搞迷糊 正确做法: dp[k][j]   经过j步到达k点 并且不经过i点的概率 这么设的原因是,就可以求不能到达i点的概率了.   不能到达i点的概率就是segma(dp[v][j-1]

codeforces 338(Div 2) Longtail Hedgehog 解题报告

题目链接:http://codeforces.com/problemset/problem/615/B 题目意思:要画一只 hedgehog,由 tail 和 spines 组成.我们要求得 beauty 最大值: tail * spines. 以下摘自 udon 原话,大家细细品味:(不一定是正确无误的哦,可能要误导他人成分...) 1.对于所有点 x,求出 x 的度数 d[x],O(n+m) 2.对于所有点 x,求出以点 x 为结尾的最长链长度 l[x],由于尾巴节点要求递增,符合DAG性质

codeforces 615B. Longtail Hedgehog

题意:输入n,m表示n个点,m条边,求一条递增的序列的点数与末尾点连接的点个数的乘积最大值. 分析:dp跑一下,时间复杂度O(m). #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> #include <cstdlib> #include <ma

*Codeforces Round #338 (Div. 2)

A. Bulbs 题意:n个开关m个灯泡,每个开关可以打开多个灯泡(按下其他开关不会导致已经亮的灯泡熄灭),问能否打开所有的灯. 做法:模拟,用tag标记能被打开的灯,遍历一遍所有的灯泡,看是否全部都能被打开. 代码如下: #include<bits/stdc++.h> #define rep(i,n) for(i=1;i<=n;i++) using namespace std; bool tag[110]; int main() { int n,m; cin>>n>&

俑烟汲的诿樟透磺勒秤窗mvus

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

算法训练(三)

1.zoj-4026 首先我们需要推倒一下,每次都是从A开始拿,可以列举几种情况,会发现最后结束一定是在第四次抽到A的时候结束的,因为假设在第二堆结束,你在抽完4次2后第二堆才为空,你需要第五次抽到2才会回到第二堆,这时候才能结束,不符合题意,因此只有第一次就被抽的A能结束游戏,因此结束的时候一定为A,因此A被抽完的可能性为ans[1]=1: 假设每种牌剩余数量分别为n1,...,n12n1,...,n12,对于2≤i≤122≤i≤12,如果ni=0ni=0说明四张ii都被拿走了,即ans[i]

利用filter实时切换big5和gb2312,以及gb2312的简繁体

IEEE Spectrum 杂志发布了一年一度的编程语言排行榜,这也是他们发布的第四届编程语言 Top 榜. 据介绍,IEEE Spectrum 的排序是来自 10 个重要线上数据源的综合,例如 Stack Overflow.Twitter.Reddit.IEEE Xplore.GitHub.CareerBuilder 等,对 48 种语言进行排行. 与其他排行榜不同的是,IEEE Spectrum 可以让读者自己选择参数组合时的权重,得到不同的排序结果.考虑到典型的 Spectrum 读者需求

HDU 3249 Test for job (有向无环图上的最长路,DP)

 解题思路: 求有向无环图上的最长路,简单的动态规划 #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <cmath> #define LL long long using namespace std; const int

ZOJ 3644 Kitty&#39;s Game (图上DP 约数)

哎-这一场就做了三个题目,全队倒数第一,简直是太弱了. A Kitty's Game (ZOJ 3644) 题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3644 题意: 给出一个有向图,每个节点有一个权值pi, 有一个人从1节点出发(其权值为1节点的权值),前往n号节点,每经过一个节点,他的权值就变成了他经过这个节点前的权值和这个节点权值的最小公倍数,如果他经过这个节点后权值不发生变化则他就不能经过这个节点