P3258 [JLOI2014]松鼠的新家-树上点差分

  • https://www.luogu.org/problemnew/show/P3258
  • 题意:树上点差分即可,注意最后一个点不需要留糖果,并且,有一些点会当作起点一次并且会再次被当做终点
  • 所以最后减去这些重复即可
  • #include
    using namespace std;
    #define maxn 1123456
    int n,head[maxn],deep[maxn],power[maxn];
    int cnt,ans,x,y,k,dp[maxn][50],lcaaaaa,a[maxn];
    struct edg
    {
        int v,to;
    } edge[maxn];
    void adda(int x,int y)
    {
        edge[++cnt].to=head[x];
        edge[cnt].v=y;
        head[x]=cnt;
    }
    void dfs(int cur,int fa)
    {
        deep[cur]=deep[fa]+1;
        dp[cur][0]=fa;
        for(int i=1; (1<=0; i--)
            if(deep[x]-(1<=deep[y])
                x=dp[x][i];
        if(x==y)return x;
        for(int i=30; i>=0; i--)
            if(dp[x][i]!=dp[y][i])
            {
                x=dp[x][i];
                y=dp[y][i];
            }
        return dp[x][0];
    }
    void get(int cur,int fa)
    {
        for(int i=head[cur]; i!=-1; i=edge[i].to)
        {
            if(edge[i].v==fa)continue;
            get(edge[i].v,cur);
            power[cur]+=power[edge[i].v];
        }
    }
    int main()
    {
        memset(head,-1,sizeof(head));
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            scanf("%d",&a[i]);
        for(int i=1; i

     

你可能感兴趣的:(差分,LCA)