Codeforces Round #338 (Div. 2) B. Longtail Hedgehog

来源:互联网 发布:爱淘宝女装 编辑:程序博客网 时间:2024/05/16 07:46

题意:给一个图,找一条数值是上升的链,使得(链的结尾字符所连的结点数*链的长度)最大。

思路:首先每个点所连的结点数是非常好找的,读入两个数,u,v,son[u]++,son[v]++即可。主要是求到这个结点的最长长度,由于当前结点只能由数值比当前结点小的结点拓展而来,从小到大求,比当前结点小的所有结点的最长长度都已经确定了。所以,只需要在当前结点所连的结点中找一个结点数值比当前结点少,并且长度最大的即可。

坑点:我好蠢,开始想着从每个点出发,去更新其他点,然后被hack的不要不要的。

http://codeforces.com/contest/615/problem/B

/*********************************************    Problem : Codeforces    Author  : NMfloat    InkTime (c) NM . All Rights Reserved .********************************************/#include <map>#include <set>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#define rep(i,a,b)  for(int i = (a) ; i <= (b) ; i ++)#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --)#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next)#define cls(a,x)   memset(a,x,sizeof(a))#define eps 1e-8using namespace std;const int MOD = 1e9+7;const int INF = 0x3f3f3f3f;const int MAXN = 1e5+5;const int MAXE = 4e5+5;typedef long long LL;typedef unsigned long long ULL;struct Edge { //记录边    int to;    Edge * next;}E[MAXE],*EE;struct Gragh { //记录图的结点    Edge * first;}G[MAXN];int T;int n,m,k;int a[1000005];void addedge(int u,int v) { //加边,双向边    EE->to = v ; EE -> next = G[u].first ; G[u].first = EE ++;    EE->to = u ; EE -> next = G[v].first ; G[v].first = EE ++;}void init() {    EE = E;    cls(G,0);}int fx[] = {0,1,-1,0,0};int fy[] = {0,0,0,-1,1};int vis[MAXN];int son[MAXN];//u连接的节点数int len[MAXN];//到达u的最大长度void input() {    init();    int u,v;    cls(son,0);    rep(i,1,m) {        scanf("%d %d",&u,&v);        addedge(u,v);        son[u] ++;        son[v] ++;    }}// void get_son(int u) {//     int cnt = 0;//     repE(p,u) {//         cnt ++;//     }//     son[u] = cnt;// }void get_len(int u) {    int v ;    repE(p,u) {        v = p->to;        if(v < u && len[u] <= len[v]) {            len[u] = len[v] + 1;        }    }}void solve() {    // cls(son,0);    // rep(i,1,n) {    //     get_son(i);//找每个节点的连接数;    // }    cls(len,0);    rep(i,1,n) {        len[i] = 1;        get_len(i);    }    LL ret = 0;    LL tmp;    rep(i,1,n) {        tmp = (LL)len[i] * (LL)son[i];        ret = max(ret,tmp);    }    printf("%I64d\n",ret);}int main(void) {    //freopen("a.in","r",stdin);    //scanf("%d",&T); while(T--) {    while(~scanf("%d %d",&n,&m)) {        input();        solve();    }    return 0;}
0 0
原创粉丝点击