zoukankan      html  css  js  c++  java
  • 51Nod1709 复杂度分析

    似乎好久没发过博客了哎……
    好不容易有空写道题了,发个博客骗点访问量
    传送门

    出题人的做法是(O(nlog^2 n))的,然而我们有(O(nlog n))的做法
    定义(f_{i,j})表示(i)的从下往上数第(2^j-1)个祖先((f_{i,0}=i)),显然有(f_{i,j}=parent_{f_{f_{i,j-1},j-1}})(用方括号来写就是(f[i][j]=parent[f[f[i][j-1]][j-1]])),可以(O(nlog n))预处理出来
    考虑按位统计答案,在统计每位的贡献时可以对每个点枚举它的祖先并考虑这个祖先作为LCA的方案数
    通过观察可以发现在统计第(j)位的贡献时离(i)最近的一段有贡献祖先一定是(f_{i,j})以上(不包括(f_{i,j})),(f_{i,j+1})以下(包括(f_{i,j+1}))这一条链的结点,而以它们作为LCA的方案数显然就是(size_{f_{i,j+1}}-size_{f_{i,j}})(size_i)表示(i)的子树大小)
    至于离(i)并非最近的那几段,容易看出和(parent_{f_{i,j}})的贡献是一样的,直接再加上(parent_{f_{i,j}})的贡献即可
    答案显然是每一位的每个结点的贡献之和,总共枚举(O(log n))位,每位(O(n)),算上预处理,总复杂度(O(nlog n))

    (好困……写的有点仓促,见谅)

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int maxn=100005;
    void dfs(int);
    vector<int>G[maxn];
    int n,p[maxn],d[maxn],f[maxn][23],size[maxn],a[maxn],cnt=0,w[maxn];
    int main(){
    	scanf("%d",&n);
    	for(int i=1,x,y;i<n;i++){
    		scanf("%d%d",&x,&y);
    		G[x].push_back(y);
    		G[y].push_back(x);
    	}
    	p[1]=1;
    	dfs(1);
    	for(int i=1;i<=n;i++){
    		f[i][0]=i;
    		f[i][1]=p[i];
    	}
    	for(int j=2;j<=21;j++)for(int i=1;i<=n;i++)f[i][j]=p[f[f[i][j-1]][j-1]];
    	long long ans=0;
    	for(int j=0;j<=20;j++){
    		memset(w,0,sizeof(w));
    		for(int i=1;i<=n;i++){
    			int x=a[i];
    			w[x]=size[f[x][j+1]]-size[f[x][j]];
    			if(d[x]>(1<<(j+1)))w[x]+=w[p[f[x][j+1]]];
    			ans+=w[x];
    		}
    	}
    	printf("%lld",ans);
    	return 0;
    }
    void dfs(int x){
    	a[++cnt]=x;
    	size[x]=1;
    	d[x]=d[p[x]]+1;
    	for(int i=0;i<(int)G[x].size();i++)if(G[x][i]!=p[x]){
    		p[G[x][i]]=x;
    		dfs(G[x][i]);
    		size[x]+=size[G[x][i]];
    	}
    }
    

    mdzz……下次放假又不知是啥时候的事儿了……垃圾hz毁我青春
    不过没关系……一个月后,又是一条好汉!

  • 相关阅读:
    java 堆、栈、方法区/ 类变量、成员变量、局部变量
    native的详细用法
    《Java项目中classpath路径详解》
    事务四大特征:原子性,一致性,隔离性和持久性(ACID)
    Tomcat 配置文件server.xml详解
    linux下vim常用命令 (更新中...)
    #1572 小Hi与花盆
    leetcode 120. Triangle
    leetcode 174. Dungeon Game
    leetcode 368. Largest Divisible Subset
  • 原文地址:https://www.cnblogs.com/hzoier/p/8593825.html
Copyright © 2011-2022 走看看