zoukankan      html  css  js  c++  java
  • [洛谷2664] 树上游戏

    传送门

    看起来像是点分,其实有 (O(n)) 做法?
    其实我就是不想写点分才这么写结果感觉脑子烧掉了

    考虑一种颜色对答案的贡献。

    考虑把树中这种颜色的点都删掉,那么就会有很多的小树,这些小树中的点互相之间不会产生贡献,而不同树的两个点之间会产生贡献。

    由此,我们可以得到每一种颜色,点的sum值就是 n - 所在小树的size。

    由此,一个点总的sum就是 n * 颜色数 - 每种颜色时所在小树的size。

    我们考虑对于一棵小树的size,存在深度最小的节点上,那么后面就可以用树上差分实现覆盖。

    嗯,大概用虚树是可以的,可是我不会
    所以size怎么求?我也不会讲,乱搞就好了

    #include<bits/stdc++.h>
    #define LL long long
    #define re register
    #define fr(i,x,y) for(int i=(x);i<=(y);i++)
    #define rf(i,x,y) for(int i=(x);i>=(y);i--)
    #define frl(i,x,y) for(int i=(x);i<(y);i++)
    using namespace std;
    const int N=100002;
    const int M=N<<1;
    int n,a[N];
    int cnt,head[N],Next[M],v[M];
    
    inline void read(int &x){
    	char ch=getchar();x=0;
    	for(;ch<'0'||ch>'9';ch=getchar());
    	for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
    }
    
    void add(int x,int y){
    	Next[++cnt]=head[x];
    	head[x]=cnt;
    	v[cnt]=y;
    }
    
    int sz[N],f[N],pre[N];
    LL tag[N],c[N];
    void dfs(int x,int fa){
    	sz[x]=1;f[x]=pre[a[x]];
    	for(re int i=head[x];i;i=Next[i])
    	 if (v[i]!=fa){
    	 	pre[a[x]]=v[i];
    	 	dfs(v[i],x);
    	 	tag[v[i]]+=sz[v[i]];
    	 	sz[x]+=sz[v[i]];
    	 }
    	tag[f[x]]-=sz[x];
    	if (f[x]==1) c[a[x]]-=sz[x];
    	pre[a[x]]=f[x];
    }
    
    LL sum[N];
    void dfs(int x,int fa,LL s){
    	int cc=c[a[x]];
    	s+=tag[x]-cc;
    	sum[x]=s;
    	for(re int i=head[x];i;i=Next[i])
    	 if (v[i]!=fa){
    	 	c[a[x]]=tag[v[i]];
    	 	dfs(v[i],x,s);
    	 }
    	c[a[x]]=cc;
    }
    
    int b[N];
    int main(){
    	read(n);
    	fr(i,1,n) read(a[i]),b[a[i]]=1;
    	int x,y;
    	fr(i,2,n){
    		read(x);read(y);
    		add(x,y);add(y,x);
    	}
    	//fr(i,1,100000) ver[i].push_back(0);
    	int tot=0;
    	fr(i,1,100000) if (b[i]) tot++,pre[i]=1,c[i]=n;
    	tag[1]=1LL*tot*n;
    	dfs(1,0);
    	dfs(1,0,0);
    	fr(i,1,n) printf("%lld
    ",1LL*n*tot-sum[i]);
    	return 0;
    }
    
  • 相关阅读:
    java环境的配置
    java基本语法
    QTP的那些事QTP回放iFrame控件时间非常慢的问题分析
    QTP的那些事有关xml的操作函数
    QTP的那些事xpath的使用(转)
    QTP的那些事有关web的自动化测试框架saffron的使用
    selenium的那些事命令行启动selenium并运行测试(转)
    QTP的那些事XPath的重要使用
    QTP的那些事有关report manager的使用
    测试环境服务器windows server 2003资源下载
  • 原文地址:https://www.cnblogs.com/ymzqwq/p/11286736.html
Copyright © 2011-2022 走看看