TC--SRM-703-Div2-1000-TreeDiameters

题目大意 :

定义树的价值为一棵树上距离为树的直径的点对的个数。

给定一颗树,让你求这个树的一个连通子图形成的树的价值最大值是多少。

首先可以想到一棵树的所有最大直径必然要经过同一点,如果有两条直径不相交,那么必然可以找到一条更长的链。

再者,如果确定了相交的这个点,对于所有这点的子树的最大深度必然只有一个与其他不同或都相同。

那么我们只用把所有的点当做直径的交点,把每个子树每个深度有多少点处理出来,然后计算所有相同的情况。

但是有不同的怎么办?枚举直径长度再计算肯定会超时。但是我们可以观察到,如果长度相差超过1,我们可以把交点向深的那棵子树里移动一下,也就是说在计算深子树的根时会计算到,所以我们只用计算其他相同深树只多1的情况。

代码 :

class TreeDiameters {
    public:

    #define MAXN 1005
    int head[MAXN],cnt;
    struct Edge{
        int to,next;
    }e[MAXN*2];
    inline void insert(int a,int b) {
        e[++cnt].next=head[a];head[a]=cnt;e[cnt].to=b;
        e[++cnt].next=head[b];head[b]=cnt;e[cnt].to=a;
    }

    int tot[MAXN],dep[MAXN][MAXN],all[MAXN];
    void dfs(int s,int v,int fa,int d) {
        dep[s][d]++;
        for(int i=head[v];i;i=e[i].next)
            if(e[i].to!=fa) dfs(s,e[i].to,v,d+1);
    }

    int ans,n;
    void work(int v) {
        memset(tot,0,sizeof(tot));tot[0]=1;
        memset(all,0,sizeof(all));
        for(int i=head[v];i;i=e[i].next) {
            memset(dep[e[i].to],0,sizeof(dep[e[i].to]));
            dfs(e[i].to,e[i].to,v,1);
            for(int j=1;j<=n;j++) {
                all[j]+=tot[j]*dep[e[i].to][j];
                tot[j]+=dep[e[i].to][j];
                ans=max(ans,all[j]);
            }
        }
        for(int i=head[v];i;i=e[i].next) {
            for(int j=0;j<=n;j++) {
                ans=max(ans,(tot[j]-dep[e[i].to][j])*dep[e[i].to][j+1]);
            }
        }
    }

    int getMax(vector<int> p) {
        n=p.size();ans=0;
        for(int i=0;i<n;i++) insert(p[i],i+1);
        for(int i=0;i<=n;i++) work(i);
        return ans;
    }
};
时间: 2024-12-26 21:51:17

TC--SRM-703-Div2-1000-TreeDiameters的相关文章

TOPCODER SRM 686 div2 1000

// TOPCODER SRM 686 div2 1000 Problem Statement 给出一个至多长 100 的字符串,仅包含 ( 和 ),问其中有多少个不重复的,合法的括号子序列. 子序列可以不连续:合法即括号序列的合法:答案模 1,000,000,007. Examples "(())(" Returns: 2 Correct non-empty bracket subsequences are "()" and "(())". &

Topcoder SRM 648 Div2 1000

Problem 给一个长度为N的字符串S,S只含有'A'.'B'.'C'三种元素.给定一个K,要求返回字符串S,使得S中恰好有K对pair(i,j)满足 0=<i<j<N,且 S[i]<S[j].若不存在,则返回空串. Limits Time Limit(ms): 2000 Memory Limit(MB): 256 N: [3, 30] K: [0, N*(N-1)/2 ] Solution 设S中含有n1个'A',n2个'B',n3个'C',设num=n1*n2+n1*n3+n

Topcoder Srm 673 Div2 1000 BearPermutations2

\(>Topcoder \space Srm \space 673 \space Div2 \space 1000 \space BearPermutations2<\) 题目大意 : 对于一个长度为 \(n\) 的排列,定义其的贡献为对其建笛卡尔树,树上有两个儿子的节点其左右儿子在原排列中的距离之和,给出 \(n, Mod\),求所有长度为 \(n\) 的排列的贡献之和对 \(Mod\) 取模的值 \(1 \leq n \leq 100\) 解题思路 : 考虑一个最暴力的 \(dp\) ,设

TC SRM 663 div2 B AABB 逆推

AABB Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 TC Description One day, Jamie noticed that many English words only use the letters A and B. Examples of such words include "AB" (short for abdominal), "BAA" (the noise a sheep makes), &

TC SRM 665 DIV2 A LuckyXor 暴力

LuckyXorTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 TC Description A lucky number is a positive integer consisting of only the digits 4 and 7.Given an int a, return an int b strictly greater than a, such that a XOR b is a lucky number. (See Notes fo

SRM 628 DIV2 1000 CandleTimerEasy 状态压缩+DFS

题意:给你一个树型蜡烛,你可以从1个或多个叶子开始点蜡烛,问你能使蜡烛烧完以后能得到时间的个数. 解题思路:状态压缩枚举DFS, 解题代码: 1 // BEGIN CUT HERE 2 /* 3 4 */ 5 // END CUT HERE 6 #line 7 "CandleTimerEasy.cpp" 7 #include <cstdlib> 8 #include <cctype> 9 #include <cstring> 10 #include

TC SRM 663 div2 A ChessFloor 暴力

ChessFloor Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 TC Description Samantha is renovating a square room. The floor of the room is an N times N grid of unit square tiles. Each tile has some color. You are given the current colors of all tiles in a

TC SRM 664 div2 AB

#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; class BearCheats{ public: string eyesight(int A, int B){ char t[256]; string s1; sprintf(t, "%d", A); s1 = t; string s2; cha

Topcoder SRM 654 Div2 1000

Problem 给一个长度为N(N∈[1,2000])的数列An(An∈[?100,100]),设ans=A1?A2?...?An,下面进行M(M∈[1,2000])次操作,每次将A的p[i]的值修改为v[i],即A[p[i]]=v[i],每次只允许加入最多2个括号进入ans等式,问ans的最大值可以是多少? Solution dp.. 设dp[i][j]表示从 1 到 i-1 已经有 j 个括弧时候的最大值,j=0时表示没有括弧,j=1时表示(这样子,j=2时表示(( 这个样子,j=3时表示(

TC SRM 664 div2 B BearPlaysDiv2 bfs

BearPlaysDiv2 Problem Statement    Limak is a little bear who loves to play. Today he is playing by moving some stones between three piles of stones. Initially, the piles contain A, B, and C stones, respectively. Limak's goal is to produce three equa