zoukankan      html  css  js  c++  java
  • [CF1060E]Sergey and Subway[树dp]

    题意

    给出 (n) 个点的树,求 (sum_{i=1}^n{sum_{j=i}^n{lceil frac{dis(i,j)}{2} ceil}}) .

    (nleq 2 imes 10^5) .

    分析

    • 点分治SBT.考虑更快速的做法。

    • 如果直接统计总的贡献唯一的问题在于奇数路径统计时上取整的问题。

    • 实际答案加上奇数长路径条数就可以解决问题。

    • 一条路径可以写成: ({dis}_u+{dis}_v-2*{dis}_{lca})(2*{dis}_{lca}) 是偶数,路径长为奇数当且仅当 ({dis}_u) ,({dis}_v) 一奇一偶。

    • 总时间复杂度为 (O(n))

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    #define pb push_back
    typedef long long LL;
    inline int gi(){
    	int x=0,f=1;char ch=getchar();
    	while(!isdigit(ch))	{if(ch=='-') f=-1;ch=getchar();}
    	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
    	return x*f;
    }
    template<typename T>inline bool Max(T &a,T b){return a<b?a=b,1:0;}
    template<typename T>inline bool Min(T &a,T b){return b<a?a=b,1:0;}
    const int N=2e5 + 7;
    int n,c0,c1,edc;
    int dep[N],son[N],head[N];
    LL sum[N],ans;
    struct edge{
    	int last,to;
    	edge(){}edge(int last,int to):last(last),to(to){}
    }e[N*2];
    void Add(int a,int b){
    	e[++edc]=edge(head[a],b),head[a]=edc;
    	e[++edc]=edge(head[b],a),head[b]=edc;
    }
    void dfs(int u,int fa){
    	if(dep[u]&1) c1++;
    	else c0++;
    	son[u]=1;
    	go(u)if(v^fa){
    		dep[v]=dep[u]+1,dfs(v,u);
    		ans+=(sum[v]+son[v])*son[u]+sum[u]*son[v];
    		son[u]+=son[v],sum[u]+=sum[v]+son[v];
    	}
    }
    int main(){
    	n=gi();
    	rep(i,1,n-1) Add(gi(),gi());
    	dfs(1,0);
    	printf("%lld
    ",(ans+1ll*c0*c1)/2);
    	return 0;
    }
    
    
  • 相关阅读:
    ios开发之-- tableview/collectionview获取当前点击的cell
    使用 urllib 进行身份验证
    关于 Handler 与 opener
    使用 urllib 构造请求对象
    使用 urllib 发送请求
    urllib 基础模块
    urllib 简介
    网络爬虫的分析算法
    网络爬虫的更新策略
    网络爬虫的爬行策略
  • 原文地址:https://www.cnblogs.com/yqgAKIOI/p/9843306.html
Copyright © 2011-2022 走看看