首页 > 其他分享 >小度挪车

小度挪车

时间:2024-07-06 20:41:42浏览次数:14  
标签:cc 小度 long int 挪车 500005 式子

  • 子树余树的信息可以通过全局信息减去子树信息来统计
  • 在最后一刻,其实你已经意识到,问题大概出在((g[fa][0]-f[n1][0])+n-sum-cnt[n1][0])这个式子上
  • 但你最终没能找出错误,因为你只关注到式子的逻辑有没有问题,而没有意识到变量对式子的诠释是否恰当——
  • 你需要的其实是O节点的个数,但n代表的是所有节点的总个数
点击查看代码
#include <bits/stdc++.h> 
using namespace std;
vector<int>a[500005];
long long s[500005],d[500005],cnt[500005][2],sum,n;
bool c[500005],pd;
long long ans,f[500005][2],g[500005][2];
int read1()
{
    char cc=getchar();
    while(!(cc>=48&&cc<=57))
    {
        cc=getchar();
    }
    int s=cc-48;
    while(1)
    {
        cc=getchar();
        if(cc>=48&&cc<=57)
        {
            s=s*10+cc-48;
        }
        else
        {
            break;
        }
    }
    return s;
}
void dfs1(int n1,int fa)
{
    s[n1]=1;
    f[n1][c[n1]]=d[n1];
    cnt[n1][c[n1]]=1;
    for(int i=0;i<a[n1].size();i++)
    {
        if(a[n1][i]!=fa)
        {
            d[a[n1][i]]=d[n1]+1;
            dfs1(a[n1][i],n1);
            s[n1]+=s[a[n1][i]];
            f[n1][0]+=f[a[n1][i]][0];
            f[n1][1]+=f[a[n1][i]][1];
            cnt[n1][0]+=cnt[a[n1][i]][0];
            cnt[n1][1]+=cnt[a[n1][i]][1];
        }
    }
    if(s[n1]==sum||n-s[n1]==sum)
    {
        pd=true;
    }
}
void dfs2(int n1,int fa)
{
    for(int i=0;i<a[n1].size();i++)
    {
        if(a[n1][i]!=fa)
        {
            g[n1][0]=g[n1][0]+f[a[n1][i]][0];
            g[n1][1]=g[n1][1]+f[a[n1][i]][1];
        }
        else if(fa!=0)
        {
            g[n1][0]+=((g[fa][0]-f[n1][0])+n-sum-cnt[n1][0]);
            g[n1][1]+=((g[fa][1]-f[n1][1])+sum-cnt[n1][1]);
        }
    }
    for(int i=0;i<a[n1].size();i++)
    {
        if(a[n1][i]!=fa)
        {
            dfs2(a[n1][i],n1);
        }
    }
    if(s[n1]==sum)
    {
        ans=min(ans,f[n1][0]+g[fa][1]-f[n1][1]);
    }
    if(n-s[n1]==sum)
    {
        ans=min(ans,f[n1][1]+g[fa][0]-f[n1][0]);
    }
}
int main()
{
    cin>>n;
    string s;
    cin>>s;
    for(int i=0;i<n;i++)
    {
        if(s[i]=='P')
        {
            c[i+1]=true;
            sum++;
        }
    }
    for(int i=1;i<n;i++)
    {
        int u,v;
        u=read1();
        v=read1();
        a[u].push_back(v);
        a[v].push_back(u);
    }
    d[1]=1;
    dfs1(1,0);
    if(pd==false)
    {
        puts("-1");
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        f[i][0]-=(cnt[i][0]*(d[i]-1));
		f[i][1]-=(cnt[i][1]*(d[i]-1));
    }
    ans=LLONG_MAX;
    dfs2(1,0);
    cout<<ans<<endl;
    return 0;
}
/*
10
OPPPOPPOPO
1 2
2 3
3 4
3 5
1 6
1 7
7 8
7 9
7 10

5
PPPPO
1 2
1 3
1 4
1 5
*/

标签:cc,小度,long,int,挪车,500005,式子
From: https://www.cnblogs.com/watersail/p/18287701

相关文章

  • 最小度限制生成树
    先看这篇题解其中主要是这两个部分的证明也就说明了为什么可以使用wqs二分这篇文章还没有详细看,有空了详细看一下(这篇文章的方法也没看,还有洛谷第一篇题解)......
  • 【模板】最小度限制生成树 题解
    其他的题解感觉都好高级,分享一种好想且好实现的方法。我们可以先把点\(s\)和与其相连的边都删除,我们发现剩下的部分变成了一些连通块。我们不难发现,当要求与\(s\)点相连的边的个数为\(k\)时,我们的连通块个数显然是\(k\)的。接下来这个问题就转化成了:\(n-1\)个点中生......
  • 小度打头阵,百度大模型能否“赋能万物”?
    文|智能相对论作者|楷楷近日,百度集团副总裁、小度科技原CEO景鲲因个人原因辞任,百度集团副总裁、首席信息官(CIO)李莹轮岗出任小度科技CEO,并向李彦宏直接汇报。随着“景鲲时代”落幕,新任CEO李莹会为小度科技带来哪些改变,或许会成为外界更关注的问题。在大模型爆发的关键时刻,小度科......
  • 小度养小猫
    https://matiji.net/exam/contest/contestdetail/55?type=4constintN=1e5+7;intn,k,c[N];voidsolve(){longlongans=0;scanf("%d%d",&n,&k......