zoukankan      html  css  js  c++  java
  • CF600E Lomsat gelral【线段树合并】

    传送门
    之前用树上启发式合并做过一次,这次再用线段树合并搞一次。
    可以发现线段树合并比启发式合并好写,但是性能是真的不敢恭维。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=1e5+10;
    int n,a[N],rt[N];
    int head[N],to[N*2],nxt[N*2],tot;
    void add(int u,int v){to[++tot]=v;nxt[tot]=head[u];head[u]=tot;}
    struct SegTrees{
    	#define mid (l+r>>1)
    	int maxv[N*50],ls[N*50],rs[N*50],tot;
    	LL msum[N*50];
    	void pushup(int id){
    		maxv[id]=msum[id]=0;
    		if(maxv[ls[id]]>maxv[rs[id]]) maxv[id]=maxv[ls[id]];
    		else maxv[id]=maxv[rs[id]];
    		if(maxv[id]==maxv[ls[id]]) msum[id]+=msum[ls[id]];
    		if(maxv[id]==maxv[rs[id]]) msum[id]+=msum[rs[id]];
    	}
    	void upd(int &id,int l,int r,int pos){
    		if(!id) id=++tot;
    		if(l==r) {maxv[id]++;msum[id]=l;return;}
    		if(pos<=mid) upd(ls[id],l,mid,pos);
    		else upd(rs[id],mid+1,r,pos);
    		pushup(id);
    	}
    	int merge(int x,int y,int l,int r){
    		if(!x||!y) return x+y;
    		if(l==r) {maxv[x]+=maxv[y];msum[x]=l;return x;}
    		ls[x]=merge(ls[x],ls[y],l,mid);
    		rs[x]=merge(rs[x],rs[y],mid+1,r);
    		pushup(x);
    		return x;
    	}
    	#undef mid
    }trs;
    
    LL ans[N];
    void dfs(int u,int fa){
    	trs.upd(rt[u],1,n,a[u]);
    	for(int i=head[u];i;i=nxt[i]){
    		if(to[i]==fa) continue;
    		dfs(to[i],u);
    		rt[u]=trs.merge(rt[u],rt[to[i]],1,n);
    	}
    	ans[u]=trs.msum[rt[u]];
    }
    
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    	for(int i=1,u,v;i<n;i++){
    		scanf("%d%d",&u,&v);
    		add(u,v);add(v,u);
    	}
    	dfs(1,0);
    	for(int i=1;i<=n;i++) printf("%lld ",ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    清除浮动的方法
    网页滚动到顶部或底部加载
    任意两个数之间的随机数
    每五个一行
    js放大镜
    HTML5本地存储
    jquery checkbox radio 标签 选中的3种方法
    jquery mouseout mouseover 多次执行
    CentOS6.5安装MySQL5.7(也适合其他版本安装)
    ubuntu下ganglia3.7.2编译安装
  • 原文地址:https://www.cnblogs.com/BakaCirno/p/12672469.html
Copyright © 2011-2022 走看看