zoukankan      html  css  js  c++  java
  • 洛谷 P3258 [JLOI2014]松鼠的新家(树上差分,lca)

    传送门


    解题思路

    简化一下问题,即为给你一个数组a,对于所有的i,将a[i]到fa[a[i+1]]路径上的点加一。
    注意端点处理(可以理解为拐弯处只记一次)。

    AC代码

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=3e5+5;
    const int maxm=6e5+5;
    int n,k,dep[maxn],dp[maxn][20],a[maxn],ans,cnt,p[maxn],fa[maxn],d[maxn],q[maxn];
    struct node{
    	int v,next;
    }e[maxn*2];
    void insert(int u,int v){
    	cnt++;
    	e[cnt].v=v;
    	e[cnt].next=p[u];
    	p[u]=cnt;
    }
    void dfs(int u,int f,int deep){
    	fa[u]=dp[u][0]=f;
    	dep[u]=deep;
    	for(int i=1;i<=19;i++){
    		if(dep[u]<(1<<i)) break;
    		dp[u][i]=dp[dp[u][i-1]][i-1];
    	}
    	for(int i=p[u];i!=-1;i=e[i].next){
    		int v=e[i].v;
    		if(v==f) continue;
    		dfs(v,u,deep+1);
    	}
    }
    int getlca(int x,int y){
    	if(dep[x]<dep[y]) swap(x,y);
    	for(int i=19;i>=0;i--){
    		if(dep[x]<(1<<i)) continue;
    		if(dep[dp[x][i]]>=dep[y]) x=dp[x][i];
    	}
    	if(x==y) return x;
    	for(int i=19;i>=0;i--){
    		if(dep[x]<(1<<i)) continue;
    		if(dp[x][i]!=dp[y][i]) x=dp[x][i],y=dp[y][i];
    	}
    	return fa[x];
    }
    void getans(int u){
    	d[u]=a[u];
    	for(int i=p[u];i!=-1;i=e[i].next){
    		int v=e[i].v;
    		if(v==fa[u]) continue;
    		getans(v);
    		d[u]+=d[v];
    	}
    }
    int main(){
    	memset(p,-1,sizeof(p));
    	ios::sync_with_stdio(false);
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>q[i];
    	for(int i=1;i<n;i++) {
    		int u,v;
    		cin>>u>>v;
    		insert(u,v);
    		insert(v,u);
    	}
    	dfs(1,0,1);
    	for(int i=1;i<n;i++){
    		int s=q[i],t=q[i+1];
    		int rt=getlca(s,t);
    		a[s]++;
    		a[fa[t]]++;
    		a[rt]--;
    		a[fa[rt]]--;
    	}
    	getans(1);
    	for(int i=1;i<=n;i++) cout<<d[i]<<endl;
        return 0;
    }
    
  • 相关阅读:
    linux c++爬虫(一)
    计算进程消费cpu和内存
    ZooKeeper server &&client
    ZooKeeper 数据模型
    转载 分布式协调技术 分布式锁
    转载 ~shell简介
    增删改查时要注意的几个地方
    搜索时,大小写问题
    ajax的一些实用技巧
    向redis插入数据时,返回值问题
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/15085673.html
Copyright © 2011-2022 走看看