您当前的位置: 首页 >  数学

钟钟终

暂无认证

  • 1浏览

    0关注

    233博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

8/24 差分lca+数学(抽屉原理)

钟钟终 发布时间:2022-08-24 23:58:04 ,浏览量:1

P1351 [NOIP2014 提高组] 联合权值

思路: 1.需要找到中间结点.若该点周围有两个顶点,则贡献为(a+b)^2- a^2 -b^2;若该点周围有三个顶点,则贡献为2ab+2ac+2bc=(a+b+c)^2-a^2-b^2-c^2 2.对于贡献的最大值,不需要进行取模操作。 3.对于每一个点进行判断,所有和它相连的点彼此间距离都为2,在其中判断出最大值,累加和即可。

#include
#define int long long
#define endl '\n'
#define For(i,a,b) for(i=(a);i=0;i--)
        if(fa[u][i]!=fa[v][i])
        u=fa[u][i],v=fa[v][i];
    return fa[u][0];
}

void solve()
{
    cin>>n;
    for(int i=1;i>u>>v;
        e[u].push_back(v);e[v].push_back(u);
    }
    for(int i=1;i>a[i];
    int mx=0;
    for(int i=1;imx1) mx2=mx1,mx1=a[j];
            else if(a[j]>mx2)
                mx2=a[j];
            t1=(t1+a[j])%mod;
            t2=(t2+a[j]*a[j])%mod;
        }
        t1=t1*t1%mod;
        ans=(ans+t1-t2+mod)%mod;
        if(mxc1>>c2;
        add(u,v,c1,c2);
        add(v,u,c1,c2);
    }
    dfs(1,0);
    for(int i=1;i>m;
    for(int i=1;i>u>>v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs(r,0);
    for(int i=1;i>x;
        coutm;
    for(int i=1;i>a[i];
    if(n>m)
    {
        cout            
关注
打赏
1664378814
查看更多评论
0.0471s