zoukankan      html  css  js  c++  java
  • CF1060E Sergey and Subway

    Jisoo

    通常来讲这种题可以按照边来考虑

    当然也可以按照点对。

    对于任意一个点对,在新图上的距离是在原图上的一半上取整,这样,我们可以先把原来的距离都求出来,奇数点和偶数点求出来并且化简一波式子。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<iomanip>
    #include<cmath>
    #include<vector>
    #include<stack>
    #include<algorithm>
    #define int long long
    using namespace std;
    template<class T>inline void read(T &x)
    {
        x=0;register char c=getchar();register bool f=0;
        while(!isdigit(c))f^=c=='-',c=getchar();
        while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
        if(f)x=-x;
    }
    template<class T>inline void print(T x)
    {
        if(x<0)putchar('-'),x=-x;
        if(x>9)print(x/10);
        putchar('0'+x%10);
    }
    int n;
    int x,y;
    vector<int> v[200001];
    int siz[200001];
    int tot;
    int ans;
    int dep[2000001];
    int cnt[2];
    void dfs(int no,int f){
    	dep[no]=dep[f]+1;
    	cnt[dep[no]%2]++;
    	siz[no]++;
    	for(auto x=v[no].begin();x!=v[no].end();++x){
    		if((*x)==f) continue;
    		dfs(*x,no);
    		siz[no]+=siz[*x];
    	}
    	return ;
    }
    signed main(){
    	read(n);
    	for(int i=1;i<n;++i){
    		read(x);read(y);
    		v[x].push_back(y);
    		v[y].push_back(x);
    	}
    	dfs(1,0);
    	for(int i=1;i<=n;++i){
    		for(auto j=v[i].begin();j!=v[i].end();++j){
    				if(dep[(*j)]>dep[i]){
    				ans+=siz[*j]*(n-siz[*j]);
    				//cout<<" "<<i<<" "<<(*j)<<endl;
    				}
    		}
    	}
    	ans+=cnt[0]*cnt[1];
    	cout<<ans/2;
    	return 0;
    }
    
  • 相关阅读:
    【图论】2-SAT 问题
    【网络流】费用流(基于Capacity Scaling)
    CF gym 102483(NWERC 2018) A题 解答
    【网络流】最小点权覆盖集、最大点权独立集
    【网络流】最大密度子图
    【网络流】最大权闭合图
    简易 vim 配置
    生成函数基础
    「NOI.AC」NOI挑战赛第二场
    SDOI2020 退役记
  • 原文地址:https://www.cnblogs.com/For-Miku/p/15521306.html
Copyright © 2011-2022 走看看